MVC Razor @foreach
我听说在视图里面有@foreach是不可能的。 意思是说,这个观点不应该有任何逻辑。 @foreach逻辑的最佳实践是什么?
@foreach..
@foreach逻辑的最佳实践是什么?
无处不在,只是摆脱它。 你可以使用编辑器或显示模板。
举个例子:
@foreach (var item in Model.Foos) { <div>@item.Bar</div> }
可以很好地被显示模板replace:
@Html.DisplayFor(x => x.Foos)
然后你将定义相应的显示模板(如果你不喜欢默认的模板)。 所以你可以定义一个可重用的模板~/Views/Shared/DisplayTemplates/Foo.cshtml
,这个模板会自动被Foos集合的每个元素( IEnumerable<Foo> Foos { get; set; }
)渲染:
@model Foo <div>@Model.Bar</div>
显然,完全相同的约定适用于编辑器模板,如果您希望显示一些input字段,以便您可以编辑视图模型,而不是仅将其显示为只读模式,则应使用该编辑器模板。
当人们说不把逻辑放在视图中时,通常是指业务逻辑,而不是渲染逻辑。 在我看来,我认为在视图中使用@foreach是完全正确的。
当我发送包含实体列表的实体(例如,在1视图中显示2个网格)时使用@foreach
,
例如,如果我以模型forms发送包含Foo1(List<Foo1>)
和Foo2(List<Foo2>)
的实体Foo
我可以参考第一个列表:
@foreach (var item in Model.Foo.Foo1) { @Html.DisplayFor(modelItem=> item.fooName) }
对@DarinDimitrov的回复,我已经在剃刀视图中使用了foreach。
<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)
时,答案将不起作用。
似乎是这样devise的, 看到这种情况 。 框架给出的例外(关于types不如预期)是相当误导和欺骗我的第一次尝试(谢谢@CodeCaster)
在这种情况下, 你必须使用@foreach
@foreach (var item in Model.Foos) { @Html.DisplayFor(x => item, "FooTemplate") }