Razor DisplayFor () не перебирает коллекцию (а EditorFor () делает!) - PullRequest
0 голосов
/ 01 июля 2018

Мое (неверное?) Понимание состоит в том, что вызов @Html.DisplayFor(x => x.SomeCollection) должен автоматически выполнять итерацию по коллекции и вызывать мой шаблон отображения для элементов в SomeCollection. Однако я вижу исключение:

Элемент модели, переданный в словарь, имеет тип 'System.Collections.Generic.List`1 [Abc.Services.Crm.Dtos.CrmPersonDto + ViewModelDataClass + UserRoleSelected]', но этот словарь требует типового элемента типа 'Abc.Services.Crm.Dtos.CrmPersonDto + ViewModelDataClass + UserRoleSelected.

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

Кроме того, если я вызываю Editor Template, я do , кажется, получаю автоматическую итерацию, только с DisplayFor() (и Display Template) я получаю исключение. Когда я вручную вызываю @foreach() для коллекции, мой шаблон отображения вызывается просто отлично.

Вот мой шаблон отображения (пожалуйста, не комментируйте структуру класса VM. Я знаю, что это нужно исправить):

@model CrmPersonDto.ViewModelDataClass.UserRoleSelected

@Html.HiddenFor(x => x.Id)
@Html.CheckBoxFor(x => x.IsTrue)
@Html.LabelFor(x => x.IsTrue, Model.TitleText)<br/>

Теперь вот мое объявление модели в Моем представлении, после чего следует вызов DisplayFor():

@model Abc.Services.Crm.Dtos.CrmPersonDto
   ... more stuff ...
@Html.DisplayFor(m => m.UserRolesSelected, "UserRoleSelected") // causes exception!

1 Ответ

0 голосов
/ 01 июля 2018

Вам необходимо удалить второй параметр вашего DisplayFor(). Когда вы добавляете templateName, вы указываете метод передачи модели (a List<UserRoleSelected>) в этот шаблон (который принимает только один экземпляр UserRoleSelected), следовательно, ошибка.

Без templateName метод выполняет итерацию каждого элемента в коллекции и передает каждый экземпляр в шаблон для генерации HTML.

Ваш код должен быть просто

@model Abc.Services.Crm.Dtos.CrmPersonDto
... more stuff ...
@Html.DisplayFor(m => m.UserRolesSelected)

Обратите внимание, что предполагается, что партиал UserRoleSelected.cshtml находится в папке /Views/Shared/DisplayTemplates (или /Views/YourControllerName/DisplayTemplates).

...