【问题标题】:Passing a IEnumerable<derivedModel> to the view when using polymorphic model binding使用多态模型绑定时将 IEnumerable<derivedModel> 传递给视图
【发布时间】:2014-04-11 15:44:56
【问题描述】:

我找到了this answer,它帮助我了解了如何使用多态模型绑定以避免为我拥有的每个派生模型创建单独的控制器。

但是,我并没有完全弄清楚如何将 IEnumerable 传递给我的 EditorTemplates。通常,通过搭建我的模型,我最终会在我的视图中得到一个 IEnumerable,我可以使用 foreach 循环循环以显示所有内容。

这样的……

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.username)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.date)
        </td>
        ...

在常规控制器中,我会使用 return View(items.ToList());但是如何通过多态模型绑定实现相同的结果?

编辑1: 这就是我的控制器的样子..

  public ActionResult Index()
        {

            List<Item> myList = new List<Item>()

            {
                new Derived1(),
                new Derived2()
            };

            var model = myList;
            return View(model);
        }

从索引我调用@Html.EditorForModel()

在我的 EditorTemplates 中有这个...

@model Gear.Models.Derived1
<h3>Phones</h3>
@Html.Hidden("ModelType", Model.GetType())

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(x => x.username)
        </th>
        <th>
            @Html.DisplayNameFor(x => x.address)
        </th>
        <th></th>
    </tr>

    <tr>

        <td>
            @Html.DisplayFor(x => x.username)
        </td>
        <td>
            @Html.DisplayFor(x => x.address)
        </td>

    </tr>
</table>

现在就像您说的那样,EditorForModel 似乎正在通过在列表中显示两个派生模型来完成其工作,但只有 DisplayNameFor 有效...我无法使用 DisplayFor 从数据库中填充实际数据的字段。是不是我做错了什么?

【问题讨论】:

  • 我没有看到你在这里做错了什么。在将模型返回到视图之前,检查您是否实际填充了模型(使用数据库中的数据)。

标签: c# asp.net-mvc polymorphism viewmodel model-binding


【解决方案1】:

如果您已经拥有EditorTemplates,只需调用@Html.EditorForModel(),而不是foreach 循环。根据对象的类型,框架会选择正确的编辑器模板进行渲染。

【讨论】:

  • 当我从 Index.cshtml 中调用 @Html.EditorForModel() 时,它会呈现它可以找到的所有 EditorTemplates。如果我尝试调用@Html.EditorForModel("templatename"),它会抱怨:“传递到字典中的模型项的类型是'Project.Models.BaseModel[]',但是这个字典需要一个'Project'类型的模型项.Models.Derived1'。我想要做的是能够为我需要的派生类调用任何 EditorTemplate。有什么线索吗?
  • 作为模型粘贴的列表中有多少项?如果您在该列表中有所有派生类型,那么 EditorForModel() 所做的可能是正确的。
  • 我在原始问题中添加了更多信息。提前致谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多