【问题标题】:Trouble loading a child model in MVC 4在 MVC 4 中加载子模型时遇到问题
【发布时间】:2023-03-14 11:22:01
【问题描述】:

我有一个包含子 _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; }
}

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

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 模型的每个字段?我肯定错过了什么。

谢谢...

【问题讨论】:

    标签: asp.net-mvc-4 viewmodel partial-views valueinjecter


    【解决方案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)
    

    【讨论】:

    • 谢谢。之后如何将 detailsModel 添加到 orderViewModel 以传递给 Order View? orderViewModel.Details = detailsModel ???还是我需要迭代以添加每个订单的详细信息?如果您能展示一些示例代码,我将不胜感激。
    • OrderViewModel 中的属性应该是这样的:public _DetailsViewModel Details { get; set; }
    • 是的。其实这只是一个错字。它在我的实际代码中设置为 _DetailsViewModel。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2019-03-05
    • 2013-10-12
    • 1970-01-01
    • 2011-12-12
    • 2022-06-22
    • 1970-01-01
    相关资源
    最近更新 更多