Я слышал, что с @foreach внутри представления нет-нет. Понятно, что в представлении не должно быть никакой логики. Какова наилучшая практика, на которой должна стоять логика для @foreach?
@foreach..
Я слышал, что с @foreach внутри представления нет-нет. Понятно, что в представлении не должно быть никакой логики. Какова наилучшая практика, на которой должна стоять логика для @foreach?
@foreach..
Какова наилучшая практика того, где должна быть логика для @foreach?
Нигде, просто избавитесь от него. Вы можете использовать шаблоны редактора или отображения.
Итак, например:
@foreach (var item in Model.Foos)
{
<div>@item.Bar</div>
}
может быть отлично заменен шаблоном отображения:
@Html.DisplayFor(x => x.Foos)
а затем вы определяете соответствующий шаблон отображения (если вам не нравится default one). Таким образом, вы бы определили шаблон повторного использования ~/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 в режиме бритвы.
<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")
}