MVC Razor @foreach


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

    @foreach.. 
5 64

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")
}