Я лично согласен с логикой Number 3 , позволяющей контроллеру заполнять модель (или модель просмотра, как иногда дифференцируется).
- У меня тупые взгляды и отображаются только данные.
- У меня есть мои View View Models, которые хранят информацию, которая понадобится View, время от времени выставляя свойства «get only», которые форматируют другие свойства в более хороший формат. Если моей модели нужен доступ к моим услугам, я чувствую, что делаю что-то не так.
- Контроллеры организуют и собирают всю информацию вместе (но не выполняют никакой реальной работы, которая остается для служб.
В вашем примере, у меня было бы действие моего контроллера, подобное:
public ActionResult Index()
{
IndexViewModel viewModel = new IndexViewModel();
viewModel.ProductSelectList = new SelectList(Service.GetProducts(), "Value", "Name");
return View(viewModel);
}
и модель моего вида похожа на:
public class IndexViewModel()
{
public SelectList ProductSelectList { get; set; }
public int ProductID { get; set; }
}
с соответствующей частью вида, похожей на:
@Html.DropDownListFor(x => x.ProductID, Model.ProductSelectList);
Таким образом, я доволен тем, что знаю, где искать, если с чем-то есть проблема, и у всего есть свое особое место.
Однако, нет правильного пути, как всегда бывает с этими вещами. У Стивена Уолтера есть хорошая серия блогов на советы MVC . В одном из них он говорит об акценте на View Model и, хотя он не заполняет список SelectList, он все же представляет собой данные во многом аналогично его списку продуктов.