I have a superclass of type Question which has multiple subclasses (e.g. MultipleChoiceQuestion and TextQuestion). Each of the subclasses have their own editor templates (e.g. ~/Shared/EditorTemplates/MultipleChoiceQuestion.cshtml).
What I would like to do is create a list of Question objects:
class Questionnaire {
List<Question> Questions;
}
which will really contain instances of the subclasses:
Questions.Add(new MultipleChoiceQuestion());
Questions.Add(new TextQuestion());
I then pass the questionnaire to the View, where I call:
@Html.EditorFor(m => m.Questions)
The view successfully renders the correct editor templates for the specific subclass Question models.
The problem is that when the form is submitted, my Questionnaire model (which contains a list of type Question) contains only instances of Question and not the instances of the subclasses. Furthermore the instances of Question properties are all null.
As a test, I have passed in a list of type MultipleChoiceQuestion and it works fine:
class Questionnaire {
List<MultipleChoiceQuestion> Questions;
}
Is there any way I can get the HttpPost Action to return my model with the subclasses instantiated with my form data?
Thanks
I think you're running up against a limitation of the DefaultModelBinder. To solve this problem, you need to use a customer model binder.
You might find this post a useful guide; it talks about this specific problem.