Asp.net mvc 3 ASP.NET MVC 3:在视图中使用可枚举扩展方法
给出以下部分视图,并理解产品是一个NHibernate映射对象,因此这里对IEnumerable的调用将触发数据库查询(在未缓存时) 这是坏习惯吗?我是否应该为此视图提供更平坦的数据视图,以便在控制器/业务逻辑中进行这些调用Asp.net mvc 3 ASP.NET MVC 3:在视图中使用可枚举扩展方法,asp.net-mvc-3,razor,separation-of-concerns,Asp.net Mvc 3,Razor,Separation Of Concerns,给出以下部分视图,并理解产品是一个NHibernate映射对象,因此这里对IEnumerable的调用将触发数据库查询(在未缓存时) 这是坏习惯吗?我是否应该为此视图提供更平坦的数据视图,以便在控制器/业务逻辑中进行这些调用 @model IEnumerable<MyProject.Data.Models.Product> <table> <tr> <th></th> <th>Tota
@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>
@model IEnumerable
订单总数
完成了
返回
有现货的
@foreach(模型中的var乘积){
@ActionLink(product.Name,“Detail”,“product”,new{id=product.id},null)
@产品订单数量
@product.Orders.Where(x=>x.completed.Count())
@product.Orders.Where(x=>x.Returned).Count()
@(product.Stock.Count-product.Orders.Count)
}
这是坏习惯吗
是。。事实上,它打破了MVC模式——视图不应该通过模型回调,而应该只接收,以便完成它唯一的工作:呈现HTML
如果只需要一个实体以外的其他信息,请使用所需的所有信息填充ViewModel,然后将其传递给视图
此外,不要在模型中循环使用IEnumerable
,请使用显示模板:
@Html.DisplayForModel()
这样做的好处是没有显式循环,利用MVC约定,并且在绑定模型时遵循模型层次结构
这是坏习惯吗
是。。事实上,它打破了MVC模式——视图不应该通过模型回调,而应该只接收,以便完成它唯一的工作:呈现HTML
如果只需要一个实体以外的其他信息,请使用所需的所有信息填充ViewModel,然后将其传递给视图
此外,不要在模型中循环使用IEnumerable
,请使用显示模板:
@Html.DisplayForModel()
这样做的好处是没有显式循环,利用MVC约定,并在绑定模型时遵循模型层次结构。这似乎是一种简单实用的方法,但从MVC的角度来看,我知道这是错误的。是的。每当您开始在视图中编写代码时,除非它是
@Html.
,否则警报就会响起,您应该重构视图/控制器以简化事情。在ViewModels或Controller中放入任何逻辑。使用foreach从模型中循环通过IEnumberable没有任何错误,只要它仅用于呈现HTML呈现逻辑。助手很棒,但不使用它们不会打破MVC模式。(@product.Orders.Where(x=>x.implemented).Count()确实如此)@weekendwarior-您的权利,使用foreach在您的模型中循环没有错,只要它只是用于呈现HTML-但是在本例中,它再次调用模型,这就是打破模式的原因。即使是基本的foreach循环,如果可以避免,也应该这样做。既然可以避免,为什么还要在视图中编写代码呢?这似乎是一种简单实用的方法,但从MVC的角度来看,我知道这是错误的。是的。每当您开始在视图中编写代码时,除非它是@Html.
,否则警报就会响起,您应该重构视图/控制器以简化事情。在ViewModels或Controller中放入任何逻辑。使用foreach从模型中循环通过IEnumberable没有任何错误,只要它仅用于呈现HTML呈现逻辑。助手很棒,但不使用它们不会打破MVC模式。(@product.Orders.Where(x=>x.implemented).Count()确实如此)@weekendwarior-您的权利,使用foreach在您的模型中循环没有错,只要它只是用于呈现HTML-但是在本例中,它再次调用模型,这就是打破模式的原因。即使是基本的foreach循环,如果可以避免,也应该这样做。既然可以避免,为什么还要在视图中编写代码?