Проблем при зареждането на дъщерен модел в 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, за да направите именуването стандартно.

АКТУАЛИЗАЦИЯ:

Как да добавя детайлния модел към orderViewModel след това, за да премина към изгледа на поръчката?

Просто просто го задавате на екземпляра на OrderViewModel така:

orderViewModel.Details = detailsModel ;

След това върнете orderViewModel към вашия изглед и направете каквото си там:

@Html.Partial("_OrderDetails", Model.Details)
person von v.    schedule 16.04.2013
comment
Благодаря. Как да добавя детайлния модел към 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