Могу ли я иметь именной шаблон отображения для коллекции

У меня есть дисплей для коллекции "SomeObject"

public List<SomeObject> SomeObjects

@Html.DisplayFor(m => m.SomeObjects)

Все это отлично работает.. Тогда у меня было требование, которое означало, что мне понадобится второй другой шаблон отображения для той же коллекции..

@Html.DisplayFor(m => m.SomeObjects, "NameOfTemplate")

Когда я делаю это, я получаю сообщение ниже. Я использовал именованные шаблоны отображения раньше, но, возможно, это работает только для примитивных типов - строк и т. Д.?

'System.Collections.Generic.List1[SomeObject]', но этот словарь требует типового элемента типа 'SomeObject',

Добавление кода в качестве запроса

"Тест" DisplayTemplate

@model ViewModels.SomeObject

<p class="Namme">
    <span>@Model.Name</span>
</p>

SimpleViewModel

 public class SomeObject
    {
        public string Name { get; set; }
    }

Недвижимость в ParentViewModel

public List<SomeObject> SomeObjects { get; set; }

Cshtml файл..

@Html.DisplayFor(m => m.SomeObjects, "Test")

Для меня это простой вопрос, может ли именованный шаблон использоваться с коллекцией или нет? Это еще одно ограничение MVC..

Ура, Джон

2 ответа

Да, вы передаете список SomeObject к вашему шаблону отображения, когда он ожидает:

@model ViewModels.SomeObject

Вам либо нужно изменить шаблон на что-то вроде этого и принять список в качестве модели представления:

@model IList<ViewModels.SomeObject>

@foreach (var item in Model) {
<p class="Namme">
    <span>@item</span>
</p>
}

Или измените то, что вы передаете в шаблон отображения в родительском файле CSHTML, и сделайте его одним объектом SomeObject что-то вроде этого:

public List<SomeObject> SomeObjects

@foreach (var item in Model.SomeObjects) {
    Html.DisplayFor(item, "TemplateName")
}

Трудно ответить, потому что я не уверен, что вы пытаетесь достичь, и что SomeObject есть, но это должно указать вам в правильном направлении.

Тип SomObjects является List<SomeObjects> поэтому шаблон представления должен иметь подходящую модель:

@model `ICollection<ViewModels.SomeObject>`

Я предпочитаю не ограничивать вид конкретным List<> класс, а лучше использовать интерфейс.

Это также означает, что вы должны настроить свой шаблон, чтобы использовать цикл для итерации по элементам в коллекции.

Другие вопросы по тегам