我听说在视图中使用 @foreach 是不行的。意思是,视图中不应该有任何逻辑。@foreach 的逻辑应该在哪里的最佳实践是什么?
@foreach..
@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
发送包含实体列表的实体时使用(例如,在 1 个视图中显示 2 个网格)
例如,如果我将包含Foo1(List<Foo1>)
和的实体 Foo 作为模型发送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.DisplayFor(x => x.Foos, "YourTemplateName)
。
似乎是这样设计的,看这个案例。此外,框架给出的异常(关于类型不符合预期)非常误导并在第一次尝试时愚弄了我(感谢@CodeCaster)
在这种情况下,您必须使用@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}