91

@foreach をビュー内に持つことは禁止されていると聞きました。つまり、ビューにはロジックが含まれていてはなりません。@foreach のロジックがどこにあるべきかについてのベスト プラクティスは何ですか?

    @foreach.. 
4

5 に答える 5

182

@foreach のロジックがどこにあるべきかについてのベスト プラクティスは何ですか?

どこにも、ただそれを取り除くだけです。エディターまたは表示テンプレートを使用できます。

たとえば、次のようになります。

@foreach (var item in Model.Foos)
{
    <div>@item.Bar</div>
}

表示テンプレートで完全に置き換えることができます:

@Html.DisplayFor(x => x.Foos)

次に、対応する表示テンプレートを定義します (デフォルトのテンプレートが気に入らない場合)。したがって、Foos コレクション ( )~/Views/Shared/DisplayTemplates/Foo.cshtmlの各要素のフレームワークによって自動的にレンダリングされる再利用可能なテンプレートを定義します。IEnumerable<Foo> Foos { get; set; }

@model Foo
<div>@Model.Bar</div>

明らかに、まったく同じ規則がエディター テンプレートに適用されます。これは、ビュー モデルを読み取り専用として表示するのとは対照的に、ビュー モデルを編集できるようにする入力フィールドを表示する場合に使用する必要があります。

于 2012-06-29T12:17:13.657 に答える
104

ビューにロジックを入れてはいけないという人は、通常、レンダリング ロジックではなく、ビジネス ロジックについて言及しています。私の謙虚な意見では、ビューで @foreach を使用することはまったく問題ないと思います。

于 2012-06-29T12:23:19.230 に答える
15

@foreachエンティティのリストを含むエンティティを送信するときに使用しています (たとえば、1 つのビューに 2 つのグリッドを表示するため)

たとえば、モデルとして Foo を含むエンティティを送信している場合Foo1(List<Foo1>)Foo2(List<Foo2>)

最初のリストは次のように参照できます。

@foreach (var item in Model.Foo.Foo1)
{
    @Html.DisplayFor(modelItem=> item.fooName)
}
于 2012-06-29T12:21:39.173 に答える
11

かみそりビューで foreach を使用した場合の @DarinDimitrov への返信。

<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>
于 2012-06-29T12:29:38.960 に答える
5

テンプレートを示すためにオーバーロードを使用する場合、答え@Html.DisplayFor(x => x.Foos, "YourTemplateName)は機能しません。

そのように設計されているようです。このケースを参照してください。また、フレームワークが提供する例外 (タイプが期待どおりではないことについて) は非常に誤解を招き、最初の試行で私をだましました (@CodeCaster に感謝)

この場合、使用する必要があります@foreach

@foreach (var item in Model.Foos)
{
    @Html.DisplayFor(x => item, "FooTemplate")
}
于 2015-09-05T11:07:05.357 に答える