Подтвердить что ты не робот

Как заполнить ViewModel в ASP.NET MVC3

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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