3

DisplayFor()コレクションを反復処理し、コレクション内の各要素を呼び出すビューがあります。

リストの区切りを描画する必要があるかどうかをテンプレートに伝えるために、(コレクションを DisplayFor に渡すのではなく) 手動で繰り返す必要があります。リスト内の項目は 2 種類のみで、順番に並べられているため、このブレークを表示する必要があるのは 1 回だけです。

テンプレートが見つかり、正しく呼び出されました。
正しく生成された HTML を確認できます。 つまりDisplayFor().ToHtmlString()
、この HTML をスコープ変数として設定できます。var html = DisplayFor().ToHtmlString()
Html.Raw(html)

どうしたの?

var renderBreakInList = Model.Items.Any(x => x.IsSomeType);
foreach(var item in Model.Items)
{
    var renderBreak = renderBreakInList && item.IsOtherType;
    Html.DisplayFor(x => item, new { renderBreak = renderBreak });

    if (renderBreak)
    {
        renderBreakInList = false;
    }
}
4

2 に答える 2

4

Html.DisplayForメソッド自体はレスポンスに何もレンダリングせず、生成された HTMLをMvcHtmlString.

@レンダリングされた HTML を実際に応答に書き込むには、記号を使用してこれを Razor に伝える必要があります。

@Html.DisplayFor(x => item, new { renderBreak = renderBreak })

したがって、コード全体は次のようになります。

@{
    var renderBreakInList = Model.Items.Any(x => x.IsSomeType);
    foreach(var item in Model.Items)
    {
        var renderBreak = renderBreakInList && item.IsOtherType;
        @Html.DisplayFor(x => item, new { renderBreak = renderBreak })

        if (renderBreak)
        {
            renderBreakInList = false;
        }
    }
}

または、メソッドを使用することもできます(記号WebPageBase.Writeを使用するときに内部で呼び出されます):@

Write(Html.DisplayFor(x => item, new { renderBreak = renderBreak }));
于 2013-07-01T20:29:59.590 に答える
0

さまざまなことを試し、テンプレートにブレークを描画するように指示する方法を作り直した後、最終的にこれを理解しました。

テンプレートをより堅牢にするために bool を送信するのではなく (順序が変更された場合)、ブレークを描画するアイテムの ID を渡します。

@{ 
    var breakItem = Model.Items.FirstOrDefault(x => renderBreakInList && x.IsSomeType);
    var breakID = breakItem == null ? (long?)null : (long)breakItem.ID;
}

@Html.DisplayFor(x => x.Items, new { breakID = breakID })    

また、nemesv が指摘したように、Html.DisplayFor()先頭に@. コード ブロック内でこれを行う習慣から抜け出しました。

于 2013-07-01T20:35:59.080 に答える