我在让我的控制器在回发时识别子类模型时遇到问题。
我正在使用存储在数据库中的字段元数据创建一个动态 Web 表单。对于我的 ViewModel,我有两种父类型
public class Form
{
public List<Question> Questions { get; set; }
}
public class Question
{
public string QuestionText { get; set; }
}
和问题的子类
public class TextBoxQuestion : Question
{
public string TextAnswer { get; set; }
public int TextBoxWidth { get; set; }
}
我还有一个视图,它将表单类型作为模型和两个显示模板,一个用于问题,一个用于 TextBoxQuestion。
//Views/Form/index.cshtml
@model Form
@Html.DisplayFor(m => m.Questions)
-
//Views/Shared/DisplayTemplates/Question.cshtml
@model Question
@if(Model is TextBoxQuestion)
{
@Html.DisplayForModel("TextBoxQuestion")
}
-
//Views/Shared/DisplayTemplates/TextBoxQuestion.cshtml
@model TextBoxQuestion
<div>
@Model.QuestionText
@Html.TextBoxFor(m => m.TextAnswer)
</div>
当页面加载时,我的控制器创建一个 TextBoxQuestion 实例,将其添加到 Question 集合中,并将 Form 对象传递给视图。一切正常,文本框出现在页面上。
但是当我回发到控制器时,代码无法将问题识别为 TextBoxQuestion。它只将其视为父类型问题。
[HttpPost]
public ActionResult Index(Form f)
{
foreach (var q in f.Questions)
{
if (q is TextBoxQuestion)
{
//code never gets here
}
else if (q is Form)
{
//gets here instead
}
}
}
有什么我想念的吗?