从MVC3中的Form获取数据?

时间:2012-04-29 22:59:09

标签: asp.net-mvc-3 forms ienumerable

我有这个用于渲染表单的视图

@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。如何解决这个问题?

2 个答案:

答案 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循环。注意:这需要使用IListList代替IEnumerable
2)您可以使用EditorTemplates自动为您应用正确的名称。