Asp.net mvc MVC Html.DisplayModelFor需要IEnumerable,我想我';我通过了,但我有个错误

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

我正在尝试使用一个显示模板(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 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-你怎么知道它是否编译了,你还没有到达那个点,你仍然会在模型类型上得到错误。视图的编译是在您访问视图时进行的,而不是在您构建项目时进行的。我问这个问题已经有一段时间了,但我假设我当时正在编译视图,如下所述: