0

我很难从我的 MVC4 应用程序中发布到控制器的小型多项选择问卷中获取值:

该模型如下所示:

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 。这似乎是在单选按钮列表中显示枚举值的最佳方式(它们在 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);
    }

问题在视图中加载得很好,但由于某种原因,发布到控制器的模型在 HttpPost 之后仍然为空,我不明白为什么。

4

2 回答 2

0

我没有看到表单有如下 Id 的映射:

@Html.HiddenFor(model => model.Id)

每个问题的内部集合也应该有 Id,以便它与表单一起发布。因此,在您的表单中的 foreach 循环中,您可以拥有的每个问题:

@Html.HiddenFor(model => item.Question.Id)

该模型还有一个类型为 MultipleChoiceQuestion 的集合。对于模型绑定到集合,集合元素的名称应该具有带有有序数字的名称属性,如这篇文章http://haacked.com/archive/2008/10/23/model-binding-to-a-list 中所述。 aspx

于 2012-12-27T08:52:18.567 回答
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)
于 2012-12-27T12:43:58.227 回答