24

CommentクラスのDisplayTemplateを作成し、その中に配置しましたComment/DisplayTemplates/Comment.cshtml

Comment.cshtml正しく入力されています:

@model Comment

次に、IEnumerable<Comment>forモデルをとる部分ビューがあります。Commentそこで、コレクションをループして、クラスにDisplayTemplateを使用したいと思います。ビュー、その整合性:

@model IEnumerable<Comment>

@foreach (var comment in Model.Where(c => c.Parent == null)) { 
    @Html.DisplayFor(model => comment)
}

ただし、次のHtml.DisplayFor行でエラーが発生します。

ディクショナリに渡されるモデルアイテムのタイプは「System.Int32」ですが、このディクショナリにはタイプ「System.String」のモデルアイテムが必要です。

foreachループ内の各アイテムに対してDisplayTemplateを呼び出すにはどうすればよいですか?

4

2 に答える 2

34

を取得するビューを作成する代わりにIEnumerable<Comment>、コレクションをループして適切な表示テンプレートを呼び出すだけです。

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

ここで、Commentsプロパティは、このコレクションの各アイテムのIEnumerable<Comment>ループを自動的に実行し、表示テンプレートをレンダリングするプロパティです。Comment.cshtml

または、本当にそのようなビューが必要な場合(理由はわかりません)、次のようにすることができます。

@model IEnumerable<Comment>
@Html.DisplayForModel()

そこで使用しているWhere句に関しては、単にそれを削除して、このタスクをコントローラーに委任する必要があります。このようなタスクを実行するビューではなく、ビューモデルを準備するのはコントローラーの責任です。

于 2011-04-13T16:31:27.020 に答える
13

受け入れられた回答はほとんどの場合うまく機能しますが、レンダリング時に要素のインデックスを認識する必要がある場合もあります(つまり、インデックスに基づいて各要素への参照を生成するカスタムJavaScriptを追加します)。

その場合でも、DisplayForは次のようにループ内で使用できます。

@model IEnumerable<Comment>

@for (int index = 0; index < Model.Count(); index++)
{
     @Html.DisplayFor(model => model[index])
}
于 2012-02-16T13:41:45.613 に答える