【问题标题】:MVC Html.DisplayModelFor Expects IEnumerable, which I think I'm passing, but I get errorMVC Html.DisplayModelFor 期望 IEnumerable,我认为我正在通过,但我收到错误
【发布时间】:2014-03-20 18:10:47
【问题描述】:

我正在尝试使用按照惯例放置在~/Views/Shared/DisplayTemplates 中的显示模板 (Pet.cshtml)。

Index 操作获取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]'. 

但我(认为)我可以清楚地看到模型项实际上是一个 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>
...

【问题讨论】:

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


    【解决方案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>
    

    ~/Shared/DisplayTemplates/Pet.cshtml:

    @model Pet
    
    <tr>
        <td>@Html.DisplayFor(x => x.Name)</td>
    </tr>
    

    【讨论】:

      【解决方案2】:

      在 Pet.cshtml 中,您传入 IEnumerable&lt;Pet&gt;,但随后尝试访问模型的 Name 属性。 IEnumerable 没有 Name 属性。

      一般来说,你会用一个 foreach 循环来包装它,这样你就可以访问列表中元素的Name 属性。但是,由于您正在尝试写出表头,因此您只想写出一次而不是遍历列表。

      看看这些其他 SO 问题:

      【讨论】:

      • 不,Pet.cshtml 可以编译,另外,如果我从 Pet.cshtml 中取出所有内容,我仍然会收到错误消息。
      • @Scott - 你怎么知道它是否可以编译,你还没有达到那个点,你仍然在模型类型上遇到错误。视图的编译发生在您访问它们时,而不是在您构建项目时。
      • 我问这个问题已经有一段时间了,但我想我当时正在整理我的观点,如下所述:haacked.com/archive/2011/05/09/…
      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 2021-02-16
      • 1970-01-01
      • 2013-04-05
      • 2016-12-02
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多