C# ASP.NET MVC3绑定到子类
我有一个类型为Question的超类,它有多个子类(例如MultipleChiiceQuestion和TextQuestion)。每个子类都有自己的编辑器模板(例如~/Shared/EditorTemplates/MultipleChoiceQuestion.cshtml) 我想做的是创建问题对象列表: 然后,我将问卷传递给视图,在视图中我调用:C# ASP.NET MVC3绑定到子类,c#,asp.net-mvc-3,data-binding,razor,C#,Asp.net Mvc 3,Data Binding,Razor,我有一个类型为Question的超类,它有多个子类(例如MultipleChiiceQuestion和TextQuestion)。每个子类都有自己的编辑器模板(例如~/Shared/EditorTemplates/MultipleChoiceQuestion.cshtml) 我想做的是创建问题对象列表: 然后,我将问卷传递给视图,在视图中我调用: @Html.EditorFor(m => m.Questions) 该视图成功呈现特定子类问题模型的正确编辑器模板 问题在于,当表单提交时,我
@Html.EditorFor(m => m.Questions)
该视图成功呈现特定子类问题模型的正确编辑器模板
问题在于,当表单提交时,我的问卷模型(包含类型为Question的列表)只包含Question的实例,而不包含子类的实例。此外,问题属性的实例都为空
作为测试,我已经通过了一个类型为multipleechoicequestion的列表,它运行良好:
class Questionnaire {
List<MultipleChoiceQuestion> Questions;
}
班级调查问卷{
列出问题;
}
有没有办法让HttpPost操作返回我的模型以及用表单数据实例化的子类
谢谢我认为您遇到了DefaultModelBinder的限制。要解决此问题,您需要使用客户模型活页夹
你可能会找到一本有用的指南;它讨论了这个特定的问题。这确实应该作为功能建议提交给ASP.NET MVC团队。我相信他们检查当前模型对象的
GetType()
,并基于此获取模板不会太难,这样做可能会解决问题=)托马斯,我认为这不是问题所在。为模型指定了一个类型,绑定器正在从表单中的数据构建该类型的实例。更确切地说,活页夹需要能够从表单中识别出所需的子类;因此需要一个定制的活页夹。你能发布MultipleChoiceQuestion.cshtml或至少部分吗?我知道我以前遇到过复选框没有返回正确值的问题。这可能是问题的一部分吗?是上面链接的帖子的更新版本。虽然这篇文章没有解决我的问题,但它确实让我找到了一个解决办法。通过将子类的类型传递给视图,我能够在自定义模型生成器中检索它,并使用反射创建子类的实例。
@Html.EditorFor(m => m.Questions)
class Questionnaire {
List<MultipleChoiceQuestion> Questions;
}