Asp.net mvc MVC Html.DisplayModelFor需要IEnumerable,我想我';我通过了,但我有个错误
我正在尝试使用一个显示模板(Pet.cshtml),按照惯例,我将其放置在Asp.net mvc MVC Html.DisplayModelFor需要IEnumerable,我想我';我通过了,但我有个错误,asp.net-mvc,asp.net-mvc-4,razor,display-templates,Asp.net Mvc,Asp.net Mvc 4,Razor,Display Templates,我正在尝试使用一个显示模板(Pet.cshtml),按照惯例,我将其放置在~/Views/Shared/DisplayTemplates中 Index操作获取IEnumerable并将其传递给Index.cshtml,后者将其传递给\u PetTablePartial。到目前为止,一切顺利。但是,当调用Html.DisplayForModel时,我得到以下错误: The model item passed into the dictionary is of type 'Pet', but thi
~/Views/Shared/DisplayTemplates
中
Index操作获取IEnumerable
并将其传递给Index.cshtml
,后者将其传递给\u 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]'.
但我(认为)我可以清楚地看到,模型项实际上是一个IEnumerable。我做错了什么
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>
...
控制器:
公共行动结果索引()
{
返回视图(pet.GetPets());//返回IEnumerable
}
Index.cshtml:
@模型IEnumerable
{Html.RenderPartial(“_PetTablePartial”,Model);}
...
_PetTablePartial.cshtml:
@模型IEnumerable
@Html.DisplayForModel()
~/Shared/DisplayTemplates/Pet.cshtml:
@模型IEnumerable
@DisplayNameFor(model=>model.Name)
...
在Pet.cshtml中,您正在传入IEnumerable
,但随后尝试访问模型的名称
属性IEnumerable
没有名称
属性
通常,您会使用foreach循环将其包装,以便可以访问列表中元素的Name
属性。但是,由于您试图写出表头,因此只需写出一次,而不需要遍历列表
看看这些其他的SO问题:
- Pet.cshtml应该有一个宠物的模型类型,因为您在这里只处理一只宠物
DisplayTemplates会自动枚举集合,并使用单个项调用DisplayTemplate。这是他们的好处之一。您不需要进行任何枚举
只需将Pet.cshtml的类型更改为Pet
我还怀疑你不想为每只宠物单独安排一张桌子。因此,您需要在局部视图中创建表和标题,然后在Pet.cshtml中只有一个数据行,因为Pet.cshtml将被多次调用,每行调用一次
PetTablePartial.cshtml:
@model IEnumerable<Pet>
<table>
<tr>
<th> Pet Name </th>
</tr>
@Html.DisplayForModel()
</table>
@model IEnumerable
昵称
@Html.DisplayForModel()
~/Shared/DisplayTemplates/Pet.cshtml:
@model Pet
<tr>
<td>@Html.DisplayFor(x => x.Name)</td>
</tr>
@model宠物
@DisplayFor(x=>x.Name)
不,Pet.cshtml是编译的,另外,如果我从Pet.cshtml中取出所有内容,我仍然会得到错误。@Scott-你怎么知道它是否编译了,你还没有到达那个点,你仍然会在模型类型上得到错误。视图的编译是在您访问视图时进行的,而不是在您构建项目时进行的。我问这个问题已经有一段时间了,但我假设我当时正在编译视图,如下所述: