通过POST将数据传递给Controller方法
本文关键字:Controller 方法 POST 数据 通过 | 更新日期: 2023-09-27 18:22:05
我有一个"调查"页面,声明如下:
@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="answerswer" 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
为null,并且变量postData
不包含表单中的任何数据。尝试通过Request[a.Displayname
访问复选框也不起作用。
我所读到的一切都表明,这是将值从Model持久化到提交方法的正确方法,并且我应该能够以这种方式访问FormCollection。
我做错了什么?
您必须将questionList保存为页面上的隐藏字段。非基元类型不会简单地通过传入它们来持久化
一种方法是
@Html.HiddenFor(m => m.Foo)
或者你可以直接在HTML中这样做
<input type="hidden" name="Var" value="foo">
其中m是你的模型。
postData
为空的事实很奇怪,因为表单标记中每个id为的输入元素都应该随POST请求一起传递。
但questionList
不会以这种方式接收,因为它是一个复杂类的列表(而不仅仅是字符串或int),而默认的ModelBinder
(将HTTP请求变量转换为传递给操作方法的参数的东西)不支持复杂类列表。
如果您希望能够接收List,则必须使用CustomModelBinder
实现自己的绑定机制。
本文可以帮助您实现它。
一个问题是您的复选框和文本框没有正确绑定到您的模型。
您应该使用@Html.CheckBoxFor
和@Html.TextBoxFor