2012-06-10 7 views
6

Mam aplikację MVC, gdzie chcę wyświetlić listę rozwijaną z informacjami z bazy danych.MVC gdzie powinna być logika Sterownik lub View Model

Opcja wyświetla informacje z bazy danych Samochody za pomocą tabeli Marka, która jest marką samochodu.

Więc moim zdaniem będzie mam coś takiego:

@model VectorCheck.ViewModels.CarsViewModel 
... 

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

więc jakoś trzeba uzyskać modelu widoku listy marek.

Mogę więc mieć pewną logikę do tego, by mówić tylko samochody, które mają kolor Czerwony.

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

Moje pytanie brzmi: gdzie najlepiej zastosować logikę dla tego zapytania. Należy go w widokuModelu lub kontrolera.

Sposób, w jaki go widzę, mam dwie opcje.

Opcja 1: Kontroler.

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)); 
     } 

ViewModel

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

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

} 

Tak więc w tym przykładzie uzyskać carMakes w kontrolerze i dać im do viewmodel, który jest po prostu pojemnik.

Opon 2: ViewModel

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

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

ViewModel

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 }); 

} 

Więc w tej opcji Kładę logiki, aby uzyskać prawidłowe carmakes w modelu widoku. To coś więcej niż pojemnik.

Więc chcę wiedzieć, który z tych sposobów jest prawidłowy sposób to zrobić?

Odpowiedz

3

W kontrolerze. ViewModel nie powinien wiedzieć o jednostce pracy, z której korzystasz. Ponadto model widoku w tym przypadku byłby o wiele bardziej przydatny do ponownego użycia, gdyby nie musiał polegać na logice x => x.Colour == "Red". Mimo że można to ogólnie przenieść na argumenty, sądzę, że wasze modele (i ich poglądy) byłyby o wiele bardziej wielokrotnego użytku, zajmując się tym w kontrolerze.

0

Powinieneś dodać swoją logikę do kontrolera. W MVC ViewModel jest obiektem, który zawiera właściwości używane w twoim widoku, bez logiki biznesowej.

0

Każda odpowiedź byłaby bardzo subiektywna, ale sugerowałbym, że posiadanie referencji _unitOfWork (lub jakiejkolwiek zależności wymagającej wstrzykiwania) w modelu widoku jest raczej brutalnym rozdzieleniem obaw.

Zachowaj w kontrolerze - daleko czyściej.

3

Jak już udzielono odpowiedzi, jest to kontroler. Aby uczynić go bardziej niezapomnianym, ułożyłbym to w ten sposób. Nie pozwól swojemu widokowi bezpośrednio rozmawiać z bazą danych. View pyta/rozmawia TYLKO z kontrolerem. Wtedy oczywiście ma sens, aby widok wysłał żądanie do kontrolera, który przekazuje go do bazy danych. Mam nadzieję, że to pomoże na przyszłość!

Powiązane problemy