我听说在视图中使用@foreach是不行的。意思是,视图中不应包含任何逻辑。关于@foreach的逻辑应该放在哪里的最佳实践是什么?
@foreach..
我听说在视图中使用@foreach是不行的。意思是,视图中不应包含任何逻辑。关于@foreach的逻辑应该放在哪里的最佳实践是什么?
@foreach..
Answers:
关于@foreach的逻辑应该放在哪里的最佳实践是什么?
无处,就摆脱它。您可以使用编辑器或显示模板。
因此,例如:
@foreach (var item in Model.Foos)
{
<div>@item.Bar</div>
}
可以完全由显示模板代替:
@Html.DisplayFor(x => x.Foos)
然后您将定义相应的显示模板(如果您不喜欢默认的显示模板)。因此,您将定义一个可重用的模板~/Views/Shared/DisplayTemplates/Foo.cshtml
,该模板将由框架为Foos集合(IEnumerable<Foo> Foos { get; set; }
)的每个元素自动呈现:
@model Foo
<div>@Model.Bar</div>
显然,对于要显示一些输入字段以允许您编辑视图模型(而不是将其显示为只读)的情况,应使用编辑器模板完全相同的约定。
foreach
呢?至少,显示模板(无论如何都是一种完全可接受的方法)都需要呈现一个新视图,这不是免费的。在大多数情况下,它不会显着影响您的网站加载时间,但是做得足够多,可能会导致性能下降。一foreach
张望了一下HTML是并将永远是几乎瞬间。就像我说的,这不是一个巨大的交易无论哪种方式,虽然,但如果有的话有一个参数的使用foreach
。
人们说不要将逻辑放在视图中时,通常是指业务逻辑,而不是呈现逻辑。以我的拙见,我认为在视图中使用@foreach完全可以。
我使用@foreach
当我发送包含的实体的列表(例如,为了显示网格2在1个视图)的实体
例如,如果我要发送包含以下内容的实体Foo作为模型Foo1(List<Foo1>)
,Foo2(List<Foo2>)
我可以使用以下内容引用第一个列表:
@foreach (var item in Model.Foo.Foo1)
{
@Html.DisplayFor(modelItem=> item.fooName)
}
对于我曾在剃刀视图中使用过foreach的情况,请回复@DarinDimitrov。
<li><label for="category">Category</label>
<select id="category">
<option value="0">All</option>
@foreach(Category c in Model.Categories)
{
<option title="@c.Description" value="@c.CategoryID">@c.Name</option>
}
</select>
</li>
Html.DropDownListFor
只考虑标题的可重用的自定义助手呢?这很琐碎,不会将您的观点变成意大利面条代码:stackoverflow.com/a/7938038/29407
optgroup
在选择列表中呈现元素,因为HtmlHelpers中不支持该元素。如果您只需要在选择列表中添加其他项目,则可以使用更好的方法来实现,然后仍然使用助手。
IEnumerable<T>
并T
为每个元素的类型调用模板。