2012-06-10 6 views
6

Ich habe eine MVC-App, wo ich eine Dropdown-Liste mit Informationen aus der Datenbank anzeigen möchte.MVC wo sollte die Logik gehen der Controller oder das View-Modell

Das Dropdown wird Informationen aus der Datenbank anzeigen Autos mit der Tabelle Make, welche die Marke des Autos ist.

Also meiner Meinung nach werde ich so etwas wie:

@model VectorCheck.ViewModels.CarsViewModel 
... 

@Html.DropDownListFor(modelItem => Model.MakeId, Model.Makes) 
... 

Also irgendwie muss ich die View-Modell die Liste der Marken erhalten.

Also könnte ich einige Logik haben, um mit diesem sagen nur Autos, die Farbe rot sind.

var redCars = _unitOfWork.Cars(x => x.Colour == "Red"); 

Also meine Frage ist, wo ist die beste Praxis, um die Logik für diese Abfrage zu setzen. Sollte es im ViewModel oder Controller gehen.

So wie ich es sehe, habe ich zwei Optionen.

Option 1: Der Controller.

public ActionResult Edit(int id) 
     { 
      var car = _unitOfWork.CarRepository.Get(id); 

      var carMakes = _unitOfWork.CarMakeRepository.Where(x => x.Colour == "Red").Select(u => new SelectListItem { Value = u.CarMakeId.ToString(), Text = u.Name }); 

      return View("Edit", new InsertUpdateCarViewModel(car, carMakes)); 
     } 

Ansichtsmodell

public Car Car { get; set; } 
public IEnumerable<SelectListItem> CarMakes { get; set; } 

InsertUpdateCarViewModel(Car car, IEnumerable<SelectListItem> carMakes) 
{ 
    Car= car; 
    CarMakes = carMakes; 

} 

So in diesem Beispiel bekomme ich die carMakes in der Steuerung und gebe sie an das Ansichtsmodell, das einfach ein Behälter ist.

Opon 2: Das Ansichtsmodell

public ActionResult Edit(int id) 
     { 
      var car = _unitOfWork.CarRepository.Get(id); 

      return View("Edit", new InsertUpdateCarViewModel(car)); 
     } 

Ansichtsmodell

public Car Car { get; set; } 
public IEnumerable<SelectListItem> CarMakes { get; set; } 

InsertUpdateCarViewModel(Car car) 
{ 
    Car= car; 

    CarMakes = _unitOfWork.CarMakeRepository.Where(x => x.Colour == "Red").Select(u => new SelectListItem { Value = u.CarMakeId.ToString(), Text = u.Name }); 

} 

Also in dieser Option setze ich die Logik, die richtigen carmakes in dem View-Modell zu bekommen. Es ist mehr als ein Container.

Also was ich möchte wissen, welche dieser Möglichkeiten ist die richtige Art, dies zu tun?

Antwort

3

In der Steuerung. Das ViewModel sollte die von Ihnen verwendete Arbeitseinheit nicht kennen. Außerdem wäre das Ansichtsmodell in diesem Fall viel wiederverwendbarer, wenn es nicht auf die Logik x => x.Colour == "Red" angewiesen wäre. Obwohl dies zu den Argumenten verschoben werden könnte, glaube ich, dass Ihre Modelle (und damit die Ansichten) viel mehr wiederverwendbar wären, wenn Sie sich darum kümmern.

0

Sie sollten Ihre Logik zum Controller hinzufügen. In MVC ist das ViewModel ein Objekt, das Eigenschaften enthält, die in Ihrer Ansicht verwendet werden, in denen keine Geschäftslogik enthalten ist.

0

Jede Antwort wäre sehr subjektiv, aber ich würde vorschlagen, dass die _unitOfWork Referenz (oder jede Abhängigkeit, die injiziert werden muss) innerhalb Ihres Sichtmodells ziemlich gewaltsame Trennung von Bedenken.

Halten Sie es in der Steuerung - weit sauberer.

3

Wie bereits beantwortet, ist es der Controller. Um es für Sie unvergesslicher zu machen, würde ich es so sagen. Lassen Sie Ihre Ansicht nicht direkt mit der Datenbank sprechen. Anzeigen fragt/spricht nur zum Controller. Dann ist es offensichtlich sinnvoll, dass die View eine Anfrage an die Steuerung sendet, die sie an die Datenbank weiterleitet. Hoffe das hilft für die Zukunft!

Verwandte Themen