Подтвердить что ты не робот

MVC Razor @foreach

Я слышал, что с @foreach внутри представления нет-нет. Понятно, что в представлении не должно быть никакой логики. Какова наилучшая практика, на которой должна стоять логика для @foreach?

    @foreach.. 
4b9b3361

Ответ 1

Какова наилучшая практика того, где должна быть логика для @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>

Очевидно, что те же самые правила применяются к шаблонам редактора, которые следует использовать, если вы хотите показать некоторые поля ввода, позволяющие редактировать модель представления в отличие от того, чтобы просто отображать ее как только для чтения.

Ответ 2

Когда люди говорят, что не ставят логику в представлениях, они обычно ссылаются на бизнес-логику, а не на логику. По моему скромному мнению, я считаю, что использование @foreach в представлениях прекрасно.

Ответ 3

Я использую @foreach при отправке сущности, содержащей список сущностей (например, для отображения 2 сетки в 1 представлении)

Например, если я отправляю в качестве модели объект Foo, содержащий Foo1(List<Foo1>) и Foo2(List<Foo2>)

Я могу обратиться к первому списку с помощью:

@foreach (var item in Model.Foo.Foo1)
{
    @Html.DisplayFor(modelItem=> item.fooName)
}

Ответ 4

ответ @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>

Ответ 5

Ответ не будет работать при использовании перегрузки, чтобы указать шаблон @Html.DisplayFor(x => x.Foos, "YourTemplateName).

Кажется, что этот способ разработан в этом случае. Кроме того, исключение, которое дает фреймворк (о типе не ожидалось), вводит в заблуждение и обманывает меня с первой попытки (спасибо @CodeCaster)

В этом случае вы должны использовать @foreach

@foreach (var item in Model.Foos)
{
    @Html.DisplayFor(x => item, "FooTemplate")
}