【问题标题】:Passing data to a Controller method via POST通过 POST 将数据传递给 Controller 方法
【发布时间】:2013-07-13 05:31:50
【问题描述】:

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

@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。

我做错了什么?

【问题讨论】:

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


【解决方案1】:

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

您可以这样做的一种方法是

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

或者你可以像这样直接在 HTML 中进行操作

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

其中 m 是您的模型。

【讨论】:

  • 我对 MVC 的显示端还很陌生。如何将 questionList 保存为隐藏字段?
【解决方案2】:

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

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

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

This article可以帮你实现。

【讨论】:

    【解决方案3】:

    一个问题是你的复选框和你的文本框没有正确绑定到你的模型。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2012-07-06
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      相关资源
      最近更新 更多