我正在尝试让用户更新数据库中复选框的值。
该视图列出了DB中的所有可用工作程序。 但是当我尝试访问复选框列表时,视图传递了错误的数据 恩。只有3个复选框,它会发送5项真/假值。
我真的很感激任何帮助。
查看示例代码
@using (Html.BeginForm("UpdateWorkersForTask", "Tasks", FormMethod.Post))
{
<table>
<tr>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.isChecked)
@Html.CheckBox("WorkersID", item.isChecked)
</tr>
}
,控制器
[HttpPost]
public ActionResult UpdateWorkersForTask(IEnumerable<bool> WorkersID, IEnumerable<string> hiddens) { }
答案 0 :(得分:1)
因为设计@Html.CheckBox
和@Html.CheckBoxFor
渲染2个输入,复选框和隐藏输入。如果你检查html,你会看到类似
<input name="WorkersID" type="checkbox" value="true">
<input name="WorkersID" type="hidden" value="false">
原因是未选中的复选框不会回发。所以第二个输入确保回发一个值。在选中复选框的情况下,DefaultModelBinder
读取第一个值为true并忽略第二个值(因为它具有相同的名称)。
在您的情况下,您没有绑定到您的模型,而只是阅读名为WorkersID
的所有输入。如果您有3个项目,但回发了5个值,则表示您选中了2个框。
要更正此问题,请按以下步骤修改您的视图和操作方法(请注意您的模型必须是IList,以便for
循环有效,或者您可以使用自定义EditorTemplate
查看
for(int i = 0; i < Model.Count i++)
{
@Html.CheckBoxFor(m => m[i].WorkersID)
}
控制器
[HttpPost]
ActionResult UpdateWorkersForTask(IEnumerable<YourModelType> model)
{
foreach(YourModelType item in model)
{
// do something with the value of item.WorkersID