Razor DisplayFor()不会遍历集合(但EditorFor()会!)

时间:2018-07-01 01:13:26

标签: asp.net-mvc razor

我的理解(不正确?)是,对@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!

1 个答案:

答案 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)文件夹中。