我希望我不会错过一些非常明显的东西,但是有没有理由为什么模型绑定器总是无法绑定从集合继承的视图模型?
假设我想显示一个分页列表并显示一个组合框并在其上方添加按钮(处理简单列表)。涉及的类看起来像:
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为null。有合理的解释吗?据我所知,它仅限于查看从集合继承的模型。
我知道我可以使用自定义绑定器解决它,但涉及的属性是原始类型,甚至没有任何泛型或继承。
我重新设计了视图模型,使集合继承了类型作为属性,并修复了问题。然而,我仍然在摸着为什么粘合剂会破坏它。任何建设性的想法都赞赏。
答案 0 :(得分:1)
回答我自己的问题:我所有与集合有关的模型不再继承通用列表或类似的,而是具有所需集合类型的属性。这样做效果更好,因为渲染时可以使用
@Html.EditorFor(m => m.CollectionProperty)
在Views / Shared / EditorTemplates下为包含的类型创建一个自定义编辑器。它也可以与模型绑定器一起使用,因为集合中的所有单个项都可以获得索引,绑定器可以在提交时自动绑定它。
获得的经验:如果您打算在视图中使用模型,请不要从集合类型继承。
答案 1 :(得分:0)
如果表单帖子中的数据格式不同,有时模型绑定到集合会更好。
我使用了一个名为postify的插件。
http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/