我有这个用于渲染表单的视图
@using ExpertApplication.ViewModels
@model IEnumerable<QuestionViewModel>
@{
ViewBag.Title = "GetQuestions";
}
@using(Html.BeginForm("ProcessAnswers", "Home", FormMethod.Post))
{
foreach(QuestionViewModel questionViewModel in Model)
{
Html.RenderPartial("QuestionPartialView", questionViewModel);
}
<input type="submit" value="Send data"/>
}
}
<h2>GetQuestions</h2>
部分视图
@using ExpertApplication.ViewModels
@model QuestionViewModel
<div id="question">
@Model.Text
<br />
<div id="answer">
@foreach(var answer in Model.AnswerViewModels)
{
@(Model.IsMultiSelected
? Html.CheckBoxFor(a => answer.Checked)
: Html.RadioButtonFor(a => answer.Checked, false))
@Html.LabelFor(a => answer.Text)
<br />
}
</div>
</div>
我想从From
获取数据[HttpPost]
public ActionResult ProcessAnswers(IEnumerable<QuestionViewModel> answerForQuesiton)
{
//answerForQuestion always is null
}
但参数answerForQuesiton为null。如何解决这个问题?
答案 0 :(得分:1)
您使用的是错误的机制。您应该使用EditorTemplates而不是部分视图。编辑器模板知道如何处理集合和创建格式正确的名称属性,以便它们可以在回发后绑定。
http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/
答案 1 :(得分:1)
MVC使用零索引名称绑定列表。不幸的是,由于这个原因,虽然foreach
循环将创建包含正确值的输入,但它们不会创建使用正确名称的输入名称。因此,您无法使用foreach
例如:
for (int i = 0; i< Model.Foo.Count(); i++)
{
for (int j = 0; j < Model.Foo[i].Bar.Count(); j++)
{
@Html.TextBoxFor(m => m.Foo[i].Bar[j].myValue)
}
}
将创建名称为“Foo [1] .Bar [2] .myValue”的文本框并正确绑定。然而,
foreach (var foo in Model.Foo)
{
foreach (var bar in foo.Bar)
{
@Html.TextBoxFor(m => bar.myVal);
}
}
将创建与前一循环具有完全相同值的文本框,但所有文本框都将具有“name =”bar.myVal“,因此它们都不能绑定。
所以要解决你的问题:
1)您可以用for循环替换foreach循环。注意:这需要使用IList
或List
代替IEnumerable
2)您可以使用EditorTemplates自动为您应用正确的名称。