【问题标题】:MVC3 Razor model binder and inherited collectionsMVC3 Razor 模型绑定器和继承的集合
【发布时间】:2011-06-21 15:17:36
【问题描述】:

我希望我不会在这里遗漏一些非常明显的东西,但是为什么模型绑定器总是无法绑定从集合继承的视图模型?

假设我想显示一个分页列表并显示一个组合框并在其上方添加按钮(处理简单列表)。涉及的课程如下所示:

public class PagedList<T> : List<T>
{
    public int TotalCount { get; set; }
}

然后是一个看起来像这样的视图模型:

public class MyViewModel : PagedList<ConcreteModel>
{
    public IEnumerable<ChildModel> List { get; set; }
    public int? SelectedChildModelId { get; set; }
}

所以在视图中(Razor):

@model MyViewModel 
@using (Html.BeginForm())
{
    @Html.DropDownListFor(model => model.SelectedChildModelId, new SelectList(Model.List, "ChildModelId", "DisplayName"))
}

以及控制器 HttpPost 动作:

public ActionResult(MyViewModel viewModel)
{
    ...
}

以上将导致 ActionResult 中的 viewModel 为空。有什么合乎逻辑的解释吗?据我所知,它仅适用于从集合继承的视图模型。

我知道我可以使用自定义绑定器解决它,但所涉及的属性是原始类型,甚至没有任何泛型或继承。

我对视图模型进行了重新设计,以将集合继承类型作为属性来解决问题。但是,我仍然对粘合剂为什么会在它上面分解而摸不着头脑。任何建设性的想法表示赞赏。

【问题讨论】:

  • 到目前为止,我一直坚持使用视图模型声明具有集合继承类型的属性,而不是从其中继承,因为找不到其他可行的解决方案。这种方法的唯一问题是它使 AutoMapper 的事情变得复杂,因为现在必须显式设置属性而不是自动映射。
  • Stack Overlow 的答案看起来很有希望。嗯,协变量 - 以前从未使用过

标签: asp.net-mvc-3 collections razor modelbinders


【解决方案1】:

回答我自己的问题:我所有与集合有关的模型不再从通用列表或类似列表继承,而是具有所需集合类型的属性。这效果更好,因为在渲染时您可以使用

@Html.EditorFor(m => m.CollectionProperty)

并在 Views/Shared/EditorTemplates 下为包含的类型创建自定义编辑器。它还可以很好地与模型绑定器一起使用,因为集合中的所有单个项目都会获得一个索引,并且绑定器能够在提交时自动绑定它。

经验教训:如果您打算在视图中使用模型,请不要从集合类型继承。

【讨论】:

    【解决方案2】:

    如果表单帖子中的数据格式不同,有时模型绑定到集合的效果会更好。

    我使用一个名为 postify 的插件。

    http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

    【讨论】:

    • 谢谢德文。当然是一个有趣的插件,但在这种情况下,它与 javascript 无关。通常,我希望我的所有 Web 应用程序都可以在没有 JavaScript 的情况下工作,并且只将其用作增强功能。在这种情况下,MVC3 提供的活页夹不知道如何使用集合模型帖子。我一直在寻找的是一种构造视图模型或从正确的基础集合继承的方法,它是正确绑定的。
    猜你喜欢
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2013-03-09
    • 2013-05-20
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多