【问题标题】:Access the value of Checkboxes from controller - DB从控制器访问复选框的值 - DB
【发布时间】:2014-10-29 18:59:48
【问题描述】:

我正在尝试让用户从 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)  { }

【问题讨论】:

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


    【解决方案1】:

    因为 @Html.CheckBox@Html.CheckBoxFor 设计为呈现 2 个输入,一个复选框和一个隐藏输入。如果您检查 html,您会看到类似

    <input name="WorkersID" type="checkbox" value="true">
    <input name="WorkersID" type="hidden" value="false">
    

    原因是未选中的复选框不会回发。所以第二个输入确保一个值被回发。在选中复选框的情况下,DefaultModelBinder读取第一个为真值并忽略第二个值(因为它具有相同的名称)。

    在您的情况下,您没有绑定到您的模型,而是您只是读取名称为 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
    

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 2020-10-18
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多