Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC 3:在视图中使用可枚举扩展方法_Asp.net Mvc 3_Razor_Separation Of Concerns - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC 3:在视图中使用可枚举扩展方法

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

给出以下部分视图,并理解产品是一个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>
@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循环,如果可以避免,也应该这样做。既然可以避免,为什么还要在视图中编写代码?