从控制器 - DB访问Checkboxes的值

时间:2014-09-04 21:43:31

标签: c# asp.net-mvc asp.net-mvc-4 razor checkbox

我正在尝试让用户更新数据库中复选框的值。

该视图列出了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)  { }

1 个答案:

答案 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