通过POST将数据传递给Controller方法

时间:2013-07-12 21:09:08

标签: c# asp.net-mvc-3 razor

我有一个'调查'页面,声明如下:

@using (Html.BeginForm("Survey", "Home", new { questionList = Model.Questions }, FormMethod.Post))
{
    <div class="survey">
        <ol class="questions">
            @foreach (Question q in Model.Questions)
            {
                <li class="question" id="@q.QuestionName">
                    @q.QuestionText<br />
                    @foreach (Answer a in q.Answers)
                    {
                        <input class="answer" id="@a.DisplayName" type="checkbox" /><label for="@a.DisplayName">@a.AnswerText</label>
                        if (a.Expandable)
                        {
                        <input type="text" id="@a.DisplayNameFreeEntry" maxlength="250" /> <span>(250 characters max)</span>
                        }
                        <br />
                    }
                </li>
            }
        </ol>
    </div>
    <div class="buttons">
        <input type="submit" value="Finish" />
    </div>
}

当我踩过我的代码时,它会触及我设置的方法来处理他们的调查:

[HttpPost]
public ActionResult Survey( List<Question> questionList, FormCollection postData)
{
     //Process Survey
}

但是,当我单步执行时,我发现变量questionList为空,变量postData不包含表单中的任何数据。尝试通过Request[a.Displayname访问复选框也不起作用。

我读过的所有内容都表明这是将值从模型持久化到提交方法的正确方法,并且我应该能够以这种方式访问​​FormCollection。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

您必须将questionList保存为页面上的隐藏字段。非原始类型不会通过传递它们来持久化。

你能做到的一种方法是

@Html.HiddenFor(m => m.Foo)

或者你可以直接在HTML中这样做

<input type="hidden" name="Var" value="foo">

其中m是你的模特。

答案 1 :(得分:1)

postData为空的这一事实很奇怪,因为表单标记内的每个输入元素都应该与POST请求一起传递。

questionList不会以这种方式接收,因为它是一个复杂类(不仅仅是字符串或int)的列表,而是默认的ModelBinder(转换HTTP请求的东西)传递给action方法的参数的变量)不支持复杂类的列表。

如果您希望能够接收List,则必须使用CustomModelBinder实现自己的绑定机制。

This article可以帮助您实施它。

答案 2 :(得分:0)

一个问题是您的复选框,而您的文本框未正确绑定到您的模型。

您应该使用@Html.CheckBoxFor@Html.TextBoxFor