2012-02-20 3 views
20

В моем контроллере у меня есть ProductInfo класс от моего домена модели и мне нужны некоторые из его информации, чтобы заполнить мою View ModelProductStatsVM.Как заполнить ViewModel в ASP.NET MVC3

Как вы заполняете модель просмотра? Я слышал три возможных пути:

  1. заселить Модельное непосредственно от контроллера (не хорошо, я хочу, чтобы мой контроллер тонкий)
  2. С помощью конструктора View Model и передать модель предметной области как параметр. (Мне нужно создать конструктор для каждого класса модели домена, который я хочу использовать)
  3. Используя метод Fill(). (Я видел это в Интернете, не знаю, как это работает. Я предполагаю, что ViewModel должен знать уровень сервиса и создавать связь).

Я знаю, что есть такие инструменты, как AutoMapper, которые я буду использовать, но прежде чем я хочу понять логику о том, как заполнить модель View из контроллера без использования какого-либо дополнительного инструмента.

+0

похоже, что вы ответили на свой вопрос. – dice

+1

Рад, что вы спросили об этом, я удивлен, что никто не задал +1 этот вопрос, как будто он сделал это в тот же день. Я играл с различными предложениями и предлагаемыми практиками, но Даринс отвечал на мою улицу, хороший вопрос, отличный ответ. – LenPopLilly

ответ

27

Идея состоит в том, что ваше действие контроллера запрашивает некоторый репозиторий для извлечения модели домена. Затем он передает эту область модели для отображения слоя, который является ответственным, чтобы преобразовать его в модель представления и, наконец, он проходит модель представления к представлению:

public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    ProductViewModel viewModel = Mapper.Map<ProductInfo, ProductViewModel>(product); 
    return View(viewModel); 
} 

, и вы можете даже сделать ваш контроллер стройнее путем введения пользовательского действие фильтр, который будет автоматически перехватывать модель в OnActionExecuted событии и вызвать в отображении слой, чтобы заменить его с соответствующей моделью представления так, что ваше действие контроллера теперь становится:

[AutoMapTo(typeof(ProductViewModel))] 
public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    return View(product); 
} 

и, конечно, теперь вид сильно типизированным к ProductViewModel:

@model ProductViewModel 
... 

До вас, чтобы реализовать метод Mapper.Map<TSource, TDest>. И если вы не хотите его реализовать самостоятельно, вы можете скачать AutoMapper, у которого уже есть этот метод для вас.

Слой отображения является тем, что является частью приложения MVC. Он должен знать как модели домена, поступающие с вашего уровня обслуживания, так и модели представления, определенные в вашем приложении MVC, чтобы иметь возможность выполнять сопоставление.

Не используйте конструкторы (кроме параметров без параметров) в ваших моделях просмотра. Связующее устройство по умолчанию захлебывается, если модель представления не имеет конструктора без параметров в ваших действиях POST, и вам придется реализовать пользовательские привязки моделей.

+0

Удивительно ясно и полно, как всегда. Большое спасибо! – CiccioMiami

+0

Действительно классный ответ :) –

+0

Кстати, где вы настраиваете сопоставление (т. Е. Mapper.CreateMap () ...)? – Abe

1

Поскольку для заполнения пользовательского интерфейса необходимы режимы просмотра, должно быть хорошей идеей, чтобы они были заполнены с помощью контроллеров. Вы все равно можете сгладить их с помощью Automapper.

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