Где следует создавать viewmodels / манипулировать в asp.net mvc?

#c# #asp.net #asp.net-mvc #asp.net-mvc-3

#c# #asp.net #asp.net-mvc #asp.net-mvc-3

Вопрос:

В ASP.NET MVC, где следует работать с viewmodels?

Должно ли это выполняться строго в контроллере? Или было бы нормально сказать, вернуть view model из метода репозитория?

Ответ №1:

На мой взгляд, viewmodels специфичны для любого приложения, которое собирается их использовать, тогда как репозиторий вернет модель, общую для всех приложений. Итак, я бы сказал, что модель представления должна быть создана внутри веб-сайта на основе общей модели, возвращаемой из репозитория, вместо того, чтобы привязывать репозиторий к знанию о том, как выкладываются представления.

Комментарии:

1. Что, если два приложения могли бы использовать одну и ту же ViewModel? Не могли бы вы тогда создать выделенный проект для виртуальной машины?

Ответ №2:

Строго говоря, ваш репозиторий должен возвращать объекты домена

Репозиторий: «Является посредником между слоями отображения домена и данных, используя интерфейс, подобный коллекции, для доступа к объектам домена».

Фаулер (PoEAA)

Ответ №3:

Viewmodels должны быть созданы в вашем контроллере и переданы в строго типизированное представление. Обычно ViewModel будет содержать несколько типов моделей, необходимых для отображения вашего представления. Вот краткий пример:

Допустим, у вас есть два объекта модели Orders и Customer

Вы хотите отобразить сведения о клиенте в верхней части страницы и сетку заказов в индексном представлении для этого клиента.

 public class CustomerModel
{
    //properties
}

public class OrderModel
{
    //properties
}

public class CustomerVM
{
    public CustomerModel customer { get; set; }
    public IEnumerable<OrderModel> orders { get; set; }
}

//and in your controller

public class CustomerController : Controller
{
    public ActionResult Index(int id)
    {
        CustomerVM vm = new CustomerVM();
        vm.customer = CustomerRepository.GetCustomer(id);
        vm.orders = OrdersRepository.GetOrdersForCustomer(id);
        return View(vm);

    }
}
  

Ответ №4:

репозиторий должен быть промежуточным между вашим доменом и пользовательским интерфейсом — репозиторий не должен ничего знать о вашем уровне пользовательского интерфейса — чтобы вы могли получить наилучшее повторное использование и максимально отделиться от него.