MVC Razor @foreach
Я слышал, что наличие @foreach внутри представления-это нет-нет. То есть в представлении не должно быть никакой логики. Какова лучшая практика в том, где должна быть логика для @foreach?
@foreach..
5 ответов:
какова лучшая практика в том, где должна быть логика для @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
когда я отправляю объект, содержащий список объектов (например, для отображения 2 сетки в 1 представлении )например, если я отправляю в качестве модели сущность Foo, которая содержит
Foo1(List<Foo1>)
иFoo2(List<Foo2>)
Я могу обратиться к первому списку с:
@foreach (var item in Model.Foo.Foo1) { @Html.DisplayFor(modelItem=> item.fooName) }
ответ на @DarinDimitrov для случая, когда я использовал foreach в представлении razor.
<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") }