2012-06-10 2 views
6

У меня есть приложение MVC, где я хочу отобразить выпадающий список с информацией из базы данных.MVC где логика должна идти Контроллер или Модель просмотра

В раскрывающемся списке будет отображаться информация из базы данных Автомобили, использующие стол «Сделай», который является маркой автомобиля.

Так на мой взгляд, у меня будет что-то вроде:

@model VectorCheck.ViewModels.CarsViewModel 
... 

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

Так или иначе я должен получить модель просмотра списка марок.

Поэтому у меня может быть некоторая логика, чтобы говорить об этом только с автомобилями, которые окрашены в красный цвет.

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

Так что мой вопрос в том, где лучше всего поставить логику для этого запроса. Должно ли оно находиться в представленииModel или контроллере.

Как я вижу, у меня есть два варианта.

Вариант 1: Контроллер.

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; 

} 

Таким образом, в этом примере я получаю carMakes в контроллере и передать их в ViewModel, который просто контейнер.

Опон 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 }); 

} 

Таким образом, в этой опции я ставлю логику, чтобы получить правильный carmakes в модели представления. Это больше, чем контейнер.

Так что я хочу знать, какой из этих способов является правильным способом сделать это?

ответ

3

В контроллере. ViewModel не должен знать, какую часть работы вы используете. Кроме того, модель представления в этом случае была бы намного более многоразовой, если бы ей не приходилось полагаться на логику x => x.Colour == "Red". Несмотря на то, что это может быть перенесено на аргументы, в целом, я считаю, что ваши модели (и, следовательно, их виды) будут намного более многоразовыми, если позаботиться об этом в контроллере.

0

Вы должны добавить свою логику в контроллер. В MVC ViewModel является объектом, который содержит свойства, используемые в вашем представлении, а не бизнес-логику.

0

Любой ответ был бы очень субъективным, но я бы предположил, что с ссылкой _unitOfWork (или любой зависимостью, которая требует инъекций) в вашей модели просмотра довольно сильное разделение проблем.

Держите его в контроллере - намного чище.

3

Как уже было сказано, это контроллер. Чтобы сделать его более запоминающимся для вас, я бы сказал так. Не позволяйте своему представлению напрямую обращаться к базе данных. View спрашивает/разговаривает только с контроллером. Тогда, очевидно, имеет смысл для представления отправить запрос контроллеру, который пересылает его в базу данных. Надеюсь, это поможет в будущем!

Смежные вопросы