我有一个OrderViewModel,它包含子_DetailsViewModel的实例。OrderViewModel有订单头信息,而_DetailsViewModel保存订单细节信息。尽管是独立的模型,但两者都有相同的单一数据源:Orders表。细节在它们自己的视图模型中的原因是,这些字段在不同的视图上以相同的视觉安排被重用,所以我把它们放在一个局部视图中,以便在需要时重用。这是我的主视图模型和子视图模型的概念:
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表中的所有数据并返回Order Entities列表。orderService = new OrderService();
var orders = orderService.GetOrderInfo(StoreNum);
从那里我使用Omu。valueinjector将结果注入到主视图模型中。
var orderViewModel = orders
.Select(x => new
OrderViewModel().InjectFrom(x)).Cast<OrderViewModel>()
.ToList();
return View(orderViewModel);
我还需要填充_Details模型,以便我可以将它从主订单视图传递给部分视图…像下图:
@Html。部分("_OrderDetails",Model._Details)
是否有一种方法可以从已经填充主订单模型的单个服务调用填充_Details模型?我是否必须将_Details属性添加到主订单视图,然后迭代订单视图以手动设置相应_Details模型的每个字段?我肯定错过了什么。
谢谢…
首先将实体移出数据库,这样您只发出一个查询请求:
// 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)