我一直试图从我的视图中调用POST操作。我看到POST方法参数始终为null。我做错了什么?
我的模特课:
public class Survey
{
public int Id { get; set; }
public int QuestionId { get; set; }
public string QuestionText { get; set; }
public int ResponseId { get; set; }
public string ResponseText { get; set; }
public string Comments { get; set; }
}
我的控制器方法:
[HttpPost]
public ActionResult Publish(List<Survey> surveyToSave)
{
if (ModelState.IsValid)
{
return View("Index");
}
//Save logc
return View("Index");
}
查看代码:
@model List<Survey>
@using (Html.BeginForm("Publish","Home",FormMethod.Post))
{
<div class="center-div">
@foreach (var item in Model)
{
<div id=@item.QuestionId class="Question">
<table>
<tr>
<td>@item.QuestionText</td>
</tr>
<tr>
<td>
<div>
<label>
@Html.RadioButtonFor(m => m.Find(i => i.QuestionId == item.QuestionId).ResponseText, "Not sure")
Not sure
</label>
</div>
<div>
<label>
@Html.RadioButtonFor(m => m.Find(i => i.QuestionId == item.QuestionId).ResponseText, "Agree")
Agree
</label>
</div>
</td>
</tr>
</table>
</div>
}
}
</div>
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Publish" class="btn btn-default" />
</div>
}
模型中的大多数属性应该从视图中填充。想法是在UI中制作模型并在帖子中提交以保存。
答案 0 :(得分:2)
您当前的视图代码正在为集合中的所有项目生成这样的输入元素。
<input id="ResponseText" name="ResponseText" type="radio" value="Not sure" />
当属性结构/名称与发布到方法匹配的表单数据匹配时,模型绑定将起作用。默认模型绑定器将查看已发布表单数据中每个项目的名称属性值,并尝试在您用作方法参数的类对象中查找匹配属性并映射值。由于您的HttpPost操作方法参数为List<Survey>
,因此要使模型绑定起作用,您的输入元素名称应该是这样的东西
<input name="[n].ResponseText" type="radio" value="Not sure" />
n
是索引的位置,从0
到Model.Count-1
您可以转换视图代码以使用for
循环并创建具有name
属性值
@model List<Survey>
@using (Html.BeginForm("Publish", "Home", FormMethod.Post))
{
<div class="center-div">
@for (var i = 0; i < Model.Count; i++)
{
<div>
<label>@Model[i].QuestionText</label>
<label>@Html.RadioButtonFor(m => Model[i].ResponseText, "Not sure")No</label>
<label>@Html.RadioButtonFor(m => Model[i].ResponseText, "Agree")Agree </label>
</div>
@Html.HiddenFor(a => Model[i].QuestionId)
}
</div>
<input type="submit" value="Publish" class="btn btn-default" />
}