Как заполнить ViewModel в ASP.NET MVC3 - PullRequest
20 голосов
/ 20 февраля 2012

В моем контроллере у меня есть ProductInfo класс из моей доменной модели , и мне нужна некоторая его информация для заполнения моей View Model ProductStatsVM.

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

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

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

Ответы [ 2 ]

27 голосов
/ 20 февраля 2012

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

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, и вам придется реализовать настраиваемые привязки модели.

1 голос
/ 20 февраля 2012

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

...