用于访问子属性的 Razor 视图中的 Linq 表达式 - 如何改用视图模型

本文关键字:视图 表达式 何改用 模型 Linq 属性 访问 Razor 用于 | 更新日期: 2023-09-27 18:18:32

场景:

数据库中 CustomerOrders 和 CustomerOrderItems 之间的父子关系。

CustomerOrders 和 CustomerOrderItems 都在自动生成的 Linq2Sql dbml 类中定义。

MVC 代码:

我有一个视图模型类:

public class OrdersListViewModel
{
    public IEnumerable<CustomerOrder> CustomerOrders { get; set; }
    public PagingInfo PagingInfo { get; set; }
}

将数据传递到部分视图(仅对客户订单数据感兴趣(:

@model CallTracking.Domain.Concrete.CustomerOrder
<tr>
    <td>@Model.Auto_ID</td>
    <td>@Model.OrderTotal</td>
    <td>@string.Format("{0} {1}", Model.CustomerFirstName, Model.CustomerSecondName)</td>
    <td>@Model.Email</td>
    **<td>@Model.CustomerOrderItems.OrderByDescending(i => i.SalesPrice).FirstOrDefault().ItemName</td>**
</tr>

这工作正常,问题是我使用了 Linq 表达式来显示每个订单记录的最高值订单项,但我觉得(并且已经阅读(我不应该在视图中使用 Linq,这应该是视图模型中的一个属性,即

public CustomerOrderItem HighestValueOrderItem { get; set; }
正是

在这一点上,我陷入了困境 - 我将如何以及在哪里设置此值?

用于访问子属性的 Razor 视图中的 Linq 表达式 - 如何改用视图模型

在客户订单模型中创建名为

private CustomerOrderItem _HighestValueOrderItem = null;
public CustomerOrderItem HighestValueOrderItem { 
get{
   if(this.CustomerOrderItems.Any() && _HighestValueOrderItem != null){
        _HighestValueOrderItem =  this.CustomerOrderItems.OrderByDescending(i => i.SalesPrice).FirstOrDefault();
        return  _HighestValueOrderItem;
   } else {
      return new CustomerOrderItem();
   }
}
}

或者在控制器中创建 DTO 时获取此值

public class OrdersListViewModel
{
   public string CurrentItem {get;set;}
   public CustomerOrder[] CustomerOrders { get; set; }
   public PagingInfo PagingInfo { get; set; }
}
//and the controller action
var model = new OrdersListViewModel
                 {
                     CurrentItem = orders.OrderByDescending(i => i.SalesPrice).FirstOrDefault().ItemNumber,
                     CustomerOrders = orders.ToArray(),
                     PagingInfo = new PagingInfo(...)
                 };
return View(model);