鉴于以下Razor Partial View并了解Product是一个NHibernate映射对象,因此这里对IEnumerable的调用将触发数据库查询(未缓存时)。
这是不好的做法吗?我是否应该为此视图提供更平坦的数据视图,以便我可以在我的控制器/业务逻辑中进行这些调用?
@model IEnumerable<MyProject.Data.Models.Product>
<table>
<tr>
<th></th>
<th>Total Orders</th>
<th>Fulfilled</th>
<th>Returned</th>
<th>In stock</th>
</tr>
@foreach (var product in Model) {
<tr>
<td>
@Html.ActionLink(product .Name, "Detail", "Product", new { id = product.Id }, null)
</td>
<td>
@product.Orders.Count
</td>
<td>
@product.Orders.Where(x=>x.Fulfilled).Count()
</td>
<td>
@product.Orders.Where(x=>x.Returned).Count()
</td>
<td>
@(product.Stock.Count - product.Orders.Count)
</td>
</tr>
}
</table>
答案 0 :(得分:1)
这是不好的做法吗?
是即可。事实上,它打破了MVC模式 - 视图不应该通过模型回调,只接收以完成它的唯一工作:呈现HTML。
如果您需要的信息不仅仅是一个实体,请使用您需要的所有信息填充 ViewModel ,然后将其传递给您的视图。
此外,请勿遍历模型中的IEnumerable
,使用显示模板:
@Html.DisplayForModel()
这样做的好处是没有显式循环,利用MVC约定,并在模型绑定时坚持模型层次。