我正在尝试按照惯例使用我放在~/Views/Shared/DisplayTemplates
中的显示模板(Pet.cshtml)。
索引操作获取IEnumerable
并将其传递给Index.cshtml
,_PetTablePartial
将其传递给Html.DisplayForModel
。到现在为止还挺好。但是,当调用The model item passed into the dictionary is of type 'Pet', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[Pet]'.
时,我收到此错误:
Controller:
public ActionResult Index()
{
return View(pet.GetPets()); // returns IEnumerable<Pet>
}
Index.cshtml:
@model IEnumerable<Pet>
{Html.RenderPartial("_PetTablePartial", Model);}
...
_PetTablePartial.cshtml:
@model IEnumerable<Pet>
@Html.DisplayForModel()
~/Shared/DisplayTemplates/Pet.cshtml:
@model IEnumerable<Pet>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
...
但我(想)我可以清楚地看到模型项目实际上是IEnumerable。我做错了什么?
{{1}}
答案 0 :(得分:1)
Pet.cshtml应该具有Pet的模型类型,因为您只在这里处理一只宠物。
DisplayTemplates会自动枚举集合,并使用单个项目调用DisplayTemplate。这是他们的好处之一。你不需要进行任何枚举。
只需将Pet.cshtml的类型更改为Pet
即可我还怀疑你不想为每只宠物分别设置一张桌子。所以你想要的是创建表和标题在你的局部视图中,Pet.cshtml中只有一个数据行,因为Pet.cshtml将被多次调用,每行一次。
PetTablePartial.cshtml:
@model IEnumerable<Pet>
<table>
<tr>
<th> Pet Name </th>
</tr>
@Html.DisplayForModel()
</table>
〜/共享/ DisplayTemplates / Pet.cshtml:
@model Pet
<tr>
<td>@Html.DisplayFor(x => x.Name)</td>
</tr>
答案 1 :(得分:0)
在Pet.cshtml中,您传递了IEnumerable<Pet>
,但随后尝试访问模型的Name
属性。 IEnumerable
没有Name
属性。
通常,您可以使用foreach循环将其包装,以便可以访问列表中元素的Name
属性。但是,由于您正在尝试写出表头,因此您只想将其写出一次而不是遍历列表。
看看这些其他SO问题: