MVC4:在HttpPost之后,ViewModel(带有radiobuttonlist)是空的

时间:2012-12-27 08:39:20

标签: asp.net-mvc-3 model http-post

我很难从我的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之后仍然为空,我不明白为什么。

2 个答案:

答案 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)