Каков наиболее оптимальный подход к созданию ViewModel?

Уважаемые пользователи,

Постигаю прелести фреймворка ASP.NET MVC вкупе с Entity Framework. Используется DataBase-First подход проектирования.

Entity Framework автоматически генерирует модели для меня, при этом каждая модель описана в partial-классе(наверное не просто так?).

Вопрос следующий: существует простая модель заказа автомобиля - Order. Упростим эту сущность до двух свойств:
-Марка автомобиля(Car)
-Имя заказчика(CustomerName)

Получаем сгенерированный класс:

public partial class Order
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            
        public string CustomerName { get; set; }
        public string Car{ get; set; }
}


С этой моделью, предположим, связаны 3 View:
-ListView - Отображение всех заказов
-ItemView - Отображение конкретного заказа
-CreateView - Добавление нового заказа

Для каждого из View я создаю отдельную ViewModel(допустим, у меня каждое View содержит еще панель управления, которая может содержать свои функции).
ListView содержит действие Create,
ItemView - Edit, Delete,
CreateView это Save, Cancel

В случае с ItemViewModel модель имеет следующий вид:

public class OrderItemViewModel
    {
        public ItemToolboxViewModel Toolbox { get; set; }
        public Data.Order Item { get; set; } // это ссылка на доменную модель
    }


В случае с последним CreateViewModel, у меня возникает необходимость дать пользователю выбрать марку, т.е. реализовать DropDownFor на вход которому нужно подать уже List<SelectListItem>. В этом случае модель имеет вид:

public class OrderItemCreateViewModel
    {
        public ItemCreateToolboxViewModel Toolbox { get; set; }
        public OrderItemCreateModel Item { get; set; }
    }

    public class OrderItemCreateModel 
    {
        public string CustomerName { get; set; }
        public string Car{ get; set; } // используется для байндинга значения во View
        public List<SelectListItem> Cars{ get; set; } // используется для заполнения списка автомобилей в DropDownFor
      }

Соответственно получая POST-запросом OrderItemCreateViewModel.Item я не могу ее отправить в Context.Orders.Add(). Приходится определять новый объект доменной модели Order и инициализировать значения свойствами из OrderItemCreateViewModel.Item
  • Вопрос задан
  • 432 просмотра
Решения вопроса 1
@kttotto
пофиг на чем писать
Наверное я не совсем что-то понял... ViewModel обозначают модели, которые будут уходить во вьюшку, для отображения там информации. Зачем в одну вьюмодел инкапсулировать другую? Эти модели в основном содержат только необходимую инфу для вьюшки и никакой логики. Если в доменной модели Вам списки авто не нужны, то не стоит их там и делать. Нужно инициализировать вьюмодел нужным списком и эту модель отдавать уже вьшке. Вьюмодел инициализируется либо вручную доменной моделью, либо автомапером.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Rou1997
@Rou1997
Никакой, потому что это MVC-фреймворк.
Ответ написан
Думаю вам необходимо добавить справочник моделей авто и создать связь один ко многим, примерно так...
public partial class Order
{
        public string CustomerName { get; set; }

        public id CarLabelId { get; set; }
        public CarLabel CarLabel { get; set; }
}
public class CarLabel
{
    public int Id  { get; set; }
    public string NameCar { get; set; }
}

С уважением, R.Zhidkov
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы