我很难从我的MVC4应用程序中发布到Controller的小型多选问卷中获取值:
该模型如下所示:
public class Evaluation
{
public int Id { get; set; }
public IEnumerable<MultipleChoiceQuestion> Question { get; set; }
public Remark Rem { get; set; }
}
public class MultipleChoiceQuestion
{
public int Id { get; set; }
public string Question { get; set; }
public MultipleChoiceAnswer Answer { get; set; }
}
public enum MultipleChoiceAnswer
{
DISAGREE,
NEUTRAL,
AGREE,
NA,
}
这是视图(省略一些标记):
@model Models.Evaluation
@using (Html.BeginForm("EvaluationB", "Evaluation", FormMethod.Post))
{
@foreach (var item in Model.Question)
{
@Html.DisplayFor(model => item.Question)
@Html.EditorFor(model => item.Question, "Enum_RadioButtonList", new { Id = item.Id })
}
@Html.Label("Remark")
@Html.TextAreaFor(model => model.Rem)
<input type="submit" value="Next" />
}
“Enum_RadioButtonList”是从这里抓取的视图:https://gist.github.com/973482。这似乎是在radiobuttonlist中显示枚举值的最佳方式(在MVC 4中它们应该是一种更简单的方式)
控制器如下所示:
public ActionResult EvaluationA()
{
Models.Evaluation evm = new Models.Evaluation();
evm.Question = db.MultipleChoiceQuestions.ToList(); //feeding the View some predefined questions
return View(evm);
}
public ActionResult EvaluationB(Models.Evaluation ev)
{
if (ModelState.IsValid)
{
// TODO: save model
return View("EvaluationB", evm);
}
return View("EvaluationA", ev);
}
问题在View中正常加载,但由于某种原因,发布到Controller的模型在HttpPost之后仍然为空,我不明白为什么。
答案 0 :(得分:0)
我没有看到表单有如下ID的映射:
@Html.HiddenFor(model => model.Id)
每个内部问题集合也应该具有Id,以便与表单一起发布。因此,您可以在表单的foreach循环中找到每个问题:
@Html.HiddenFor(model => item.Question.Id)
此外,该模型还有MultipleChoiceQuestion类型的集合。对于与集合的模型绑定,集合元素的名称应具有带有序数字的name属性,如本文http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx中所述
答案 1 :(得分:0)
我做了一些研究偶然发现了这篇文章:
http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx
问题在于html字段的命名。我添加了这样的视图,现在我可以正确地读出控制器中的值:
@for (int i = 0; i < 6; i++)
{
<tr>
<td>
@Html.DisplayFor(m => m.Question[i].Question)
</td>
<td class="mult_question">
@Html.EditorFor(m => m.Question[i].Answer, "Enum_RadioButtonList" )
</td>
</tr>
}
<tr>
<td>
@Html.Label("Remark")
@Html.TextAreaFor(m => m.Remark)