【发布时间】: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