MVC Html.DisplayModelFor期待IEnumerable,我想我已经过了,但是我得到了错误

时间:2014-03-20 18:10:48

标签: asp.net-mvc asp.net-mvc-4 razor display-templates

我正在尝试按照惯例使用我放在~/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}}

2 个答案:

答案 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问题: