Проблема с загрузкой дочерней модели в MVC 4

У меня есть OrderViewModel, который включает экземпляр дочерней модели _DetailsViewModel. OrderViewModel содержит информацию о заголовке заказа, а _DetailsViewModel содержит подробную информацию о заказе. Несмотря на то, что они являются отдельными моделями, обе они имеют один и тот же источник данных — таблицу «Заказы». Причина того, что детали находятся в их собственной модели представления, заключается в том, что эти поля повторно используются в другом представлении в том же визуальном расположении, поэтому я помещаю их в частичное представление для повторного использования по мере необходимости. Вот идея моей основной и дочерней моделей просмотра:

public class OrderViewModel
{
    public string OrderNum  { get; set; }
    public string CustonerName{ get; set; }
    public double SalesPrice{ get; set; }
    public _Details Details { get; set; }
}

public class _DetailsViewModel
{
    public string PhoneNum { get; set; }
    public string ItemNum { get; set; }
    public double Quantity { get; set; }
    public string PayMethod{ get; set; }
    public string Comments { get; set; }
}

В моем контроллере я вызываю службу, которая возвращает все данные из таблицы «Заказы» и возвращает список объектов заказа.

orderService = new OrderService();
var orders = orderService.GetOrderInfo(StoreNum);

Оттуда я использую Omu.ValueInjecter для ввода результатов в основную модель представления.

var orderViewModel = orders
                    .Select(x => new                              
                      OrderViewModel().InjectFrom(x)).Cast<OrderViewModel>()
                    .ToList();

return View(orderViewModel);

Мне также нужно заполнить модель _Details, чтобы я мог передать ее в частичное представление из моего основного представления заказа... как показано ниже:

@Html.Partial("_OrderDetails", Model._Details)

Есть ли способ заполнить модель _Details из одного вызова службы, который уже заполняет основную модель заказа? Придется ли мне добавлять свойства _Details в основное представление заказа, а затем итерировать представление заказа, чтобы вручную установить каждое поле соответствующей модели _Details? Наверняка я что-то упускаю.

Спасибо...


person user2167861    schedule 16.04.2013    source источник


Ответы (1)


Сначала переместите объекты из вашей базы данных, таким образом вы выдаете только один запрос запроса:

// apply any filter(s) needed here.
var orderList = orders.ToList();

// then do injecting using the "cached" orders 
var orderViewModel = orderList
    .Select(x => new OrderViewModel().InjectFrom(x))
    .Cast<OrderViewModel>()
    .ToList();

// then inject into your details model
var detailsModel = orderList
    .Select(x => new _DetailsViewModel().InjectFrom(x))
    .Cast<_DetailsViewModel>()
    .ToList();

И небольшое предложение, если позволите, убрать подчеркивание для _DetailsViewModel, чтобы сделать имена стандартными.

ОБНОВЛЕНИЕ:

Как потом добавить detailsModel в orderViewModel, чтобы перейти к просмотру заказа?

Вы просто устанавливаете его в экземпляр OrderViewModel вот так:

orderViewModel.Details = detailsModel ;

Затем верните orderViewModel в свой вид и сделайте там свое дело:

@Html.Partial("_OrderDetails", Model.Details)
person von v.    schedule 16.04.2013
comment
Спасибо. Как потом добавить detailsModel в orderViewModel, чтобы перейти к просмотру заказа? orderViewModel.Details = detailsModel ??? Или мне нужно повторить, чтобы добавить детали для каждого заказа? Если бы вы могли показать пример кода, я был бы очень признателен. - person user2167861; 16.04.2013
comment
Должно ли свойство в OrderViewModel быть следующим: public _DetailsViewModel Details { get; set; }? - person von v.; 16.04.2013
comment
Да, это. На самом деле это была просто опечатка. В моем реальном коде установлено значение _DetailsViewModel. - person user2167861; 16.04.2013