用于访问子属性的 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; }
正是在这一点上,我陷入了困境 - 我将如何以及在哪里设置此值?
在客户订单模型中创建名为
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);