ASP.NET MVC 3:在视图中使用Enumerable扩展方法

时间:2011-02-23 10:36:18

标签: asp.net-mvc-3 razor separation-of-concerns

鉴于以下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>

1 个答案:

答案 0 :(得分:1)

  

这是不好的做法吗?

即可。事实上,它打破了MVC模式 - 视图不应该通过模型回调,只接收以完成它的唯一工作:呈现HTML。

如果您需要的信息不仅仅是一个实体,请使用您需要的所有信息填充 ViewModel ,然后将其传递给您的视图。

此外,请勿遍历模型中的IEnumerable,使用显示模板:

@Html.DisplayForModel()

这样做的好处是没有显式循环,利用MVC约定,并在模型绑定时坚持模型层次。