1

我有一个包含子 _DetailsViewModel 实例的 OrderViewModel。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; }
}

在我的控制器中,我调用了一个服务,该服务返回 Orders 表中的所有数据并返回一个订单实体列表。

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 模型的每个字段?我肯定错过了一些东西。

谢谢...

4

1 回答 1

2

首先将实体移出数据库,这样您只需发出一个查询请求:

// 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();

如果可以的话,还有一个小建议,删除下划线 for_DetailsViewModel以制定命名标准。

更新:

之后如何将 detailsModel 添加到 orderViewModel 以传递给 Order View?

您只需将其设置为如下实例OrderViewModel

orderViewModel.Details = detailsModel ;

然后返回orderViewModel您的视图并在那里做您的事情:

@Html.Partial("_OrderDetails", Model.Details)
于 2013-04-16T04:52:56.883 回答