我的理解(不正确?)是,对@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 模板,我 do 似乎会获得自动迭代,它仅与DisplayFor()
(和显示模板),我得到了例外。当我手动调用集合中的@foreach()
时,我的显示模板就可以了。
这是我的显示模板(请不要对VM类结构发表评论。我知道它需要修复):
@model CrmPersonDto.ViewModelDataClass.UserRoleSelected
@Html.HiddenFor(x => x.Id)
@Html.CheckBoxFor(x => x.IsTrue)
@Html.LabelFor(x => x.IsTrue, Model.TitleText)<br/>
现在这是我在View中的模型声明,然后是对DisplayFor()
的调用:
@model Abc.Services.Crm.Dtos.CrmPersonDto
... more stuff ...
@Html.DisplayFor(m => m.UserRolesSelected, "UserRoleSelected") // causes exception!
答案 0 :(得分:1)
您需要删除DisplayFor()
的第二个参数。当您添加templateName
时,您正在告诉该方法将模型(List<UserRoleSelected>
)传递到该模板(该模板仅接受UserRoleSelected
的单个实例),因此出错。 / p>
在没有templateName
的情况下,该方法将迭代集合中的每个项目,并将每个实例传递到模板以生成html。
您的代码应该只是
@model Abc.Services.Crm.Dtos.CrmPersonDto
... more stuff ...
@Html.DisplayFor(m => m.UserRolesSelected)
请注意,这假定UserRoleSelected.cshtml
部分位于/Views/Shared/DisplayTemplates
(或/Views/YourControllerName/DisplayTemplates
)文件夹中。