4

ビューを作成するときは、できるだけ多くの処理ロジックを排除したいと考えています。理想的には、Razor で HTML とレンダリング値だけに固執したいと思います。

BarModel オブジェクトのリストを持つ FooModel があるとします。

public class FooModel
{
    public List<BarModel> Bars { get; set; }

    public string FoosFirstValue { get; set; }
    public string FoosOtherValue { get; set; }
}

public class BarModel
{
    public string SomeValue { get; set; }
    public string SomeOtherValue { get; set; }
}

私の見解では、ループしてバーに要素を表示する必要があります。

@model MyApp.FooModel
<div>@Model.FoosFirstValue</div>
<div>@Model.FoosOtherValue </div>
<div>
    Bars:
    <ul>
        @foreach (var bar in Model.Bars)
        {
            <li>@bar.SomeValue: @bar.SomeOtherValue</li>
        }
    </ul>
</div>

私のビューでループを使用しないようにする方法はありますか?

4

1 に答える 1

12

MVCビューでループすることは必ずしも悪いことではありませんが、一部の純粋主義者(あなたのように)は、ビューを非常にきれいに保ち、処理ロジックをなくすことを好みます。

幸いなことに、MVC にはあまり知られていない宝石があり、オブジェクトの IEnumerable リストを取得し、それを特異なオブジェクトにバインドされたエディター/表示テンプレートにレンダリングできます。ループを処理します。

たとえば、表示テンプレートの部分ビューを設定する場合、それを BarModel.cshtml と呼びます ( 「DispalyTemplate」サブフォルダーの下のPartialViewLocationFormats 検索パスの 1 つに保存する必要があります)。

@model MyApp.BarModel
<li>@Model.SomeValue: @Model.SomeOtherValue</li>

これで、ビューで を使用して表示テンプレートを呼び出すだけHtml.DisplayForで、完全なリストをモデルとして渡すことができます。

<div>
    Bars:
    <ul>
        @Html.DisplayFor(m => m.Bars)
    </ul>
</div>

以上です。BarModels のリストを取得し、リスト内の各 BarModel オブジェクトの部分的な表示テンプレートを生成します。

もちろん、あなたの単純な例では、単にループロジックを取り除きたいだけでない限り、大きな利点はないので、個人的な好みに依存します.

ただし、この表示テンプレートを同じビューの複数の場所または異なるビューで共有する必要がある場合は、このようにビューを構築して複雑さとコードの重複を減らすことは本当に効果的です。

もう 1 つの補足事項: このアプローチでは、リスト内のすべての項目を、リストに格納されている順序で表示することを前提としています。アイテムを条件付きで表示する必要がある場合、または別の順序で表示する必要がある場合、このアプローチは機能しません。

ただし、この場合は、ビューに表示する必要があるとおりにリストを設定することをお勧めします。つまり、リストを構築するコントローラー/サービス内でフィルタリング/並べ替えを行い、ビューをモデルのレンダリングだけに残します。

于 2012-11-30T15:29:46.267 に答える