Использование DisplayTemplate (с DisplayFor) для каждого элемента в коллекции - PullRequest
20 голосов
/ 13 апреля 2011

Я создал DisplayTemplate для класса Comment и поместил его в Comment/DisplayTemplates/Comment.cshtml.

Comment.cshtml правильно напечатано:

@model Comment

Затем у меня есть частичное представление, которое принимает IEnumerable<Comment> для модели. Там я перебираю коллекцию и хочу использовать DisplayTemplate для класса Comment. Мнение, в его целостности:

@model IEnumerable<Comment>

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

Однако в строке Html.DisplayFor появляется ошибка:

Элемент модели, передаваемый в словарь, имеет тип 'System.Int32', но для этого словаря требуется элемент модели типа 'System.String'.

Как я могу вызвать DisplayTemplate для каждого элемента в цикле foreach?

Ответы [ 2 ]

31 голосов
/ 13 апреля 2011

Вместо того, чтобы иметь представление, которое принимает IEnumerable<Comment> и которое все это делает, это циклически перебирает коллекцию и просто вызывает соответствующий шаблон отображения:

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

, где свойство Comments является IEnumerable<Comment>, которое автоматически выполнит цикл и отобразит шаблон отображения Comment.cshtml для каждого элемента этой коллекции.

Или, если вам действительно нужен такой вид (не знаю почему), вы можете просто:

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

Что касается используемого здесь Where, вы должны просто удалить его и делегировать эту задачу контроллеру. Ответственность за подготовку модели представления лежит на контроллере, а не на представлении, выполняющем такие задачи.

12 голосов
/ 16 февраля 2012

Хотя принятый ответ в большинстве случаев работает хорошо, существуют другие случаи, когда нам нужно знать об индексе элемента при рендеринге (т.е. добавить пользовательский JavaScript, который генерирует ссылки на каждый элемент на основе их индекса).*

В этом случае DisplayFor все еще можно использовать в цикле следующим образом:

@model IEnumerable<Comment>

@for (int index = 0; index < Model.Count(); index++)
{
     @Html.DisplayFor(model => model[index])
}
...