【问题标题】:Multiple checkboxes in razor (using foreach)razor 中的多个复选框(使用 foreach)
【发布时间】:2015-11-13 19:01:50
【问题描述】:

我有一个问题,我找不到解决方案。 我正在使用 Razor,它是我的 VieModel 类。

public class GroupToExport
{
    public GroupToExport()
    {
        ToExport = false;
    }

    [DisplayName("Export")]
    public bool ToExport { get; set; }
    public Group Group { get; set; }

}

public class GroupsToExport
{
    public GroupsToExport()
    {
        //refill list
    }

    public List<GroupToExport> ExportingGroups { get; set; }
}

查看:

@using (Html.BeginForm("Export", "ElmahGroup", FormMethod.Post, new { id = "toExportForm" }))
{
//some divs
    <input type="submit" id="js-export-submit" value="Export" />
 @foreach (var item in Model.ExportingGroups)
                {
                    <tr>
                        <td class="js-export-checkbox">
                            @Html.CheckBoxFor(modelItem => item.ToExport)
                        </td>
                    </tr>
                }
//some divs
}

控制器:

public ActionResult Export(GroupsToExport model)
    {
        var groupsToExport = model.ExportingGroups.Where(x => x.ToExport).Select(x => x);
        throw new System.NotImplementedException();
    }

提交“ToExport”后,在Controller中,每个组的值总是'false'。即使检查了所有组。

有人可以帮助我吗?我做错了什么?

【问题讨论】:

  • 模型中的数据是如何来的(参数)。也许你应该检查 checkbox-html 的名称。

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


【解决方案1】:

您不能使用foreach 循环为集合生成控件。您为每个复选框(以及相关的隐藏输入)生成的 html 是 &lt;input type="checkbox" name="item.ToExport" .../&gt;。您的模型不包含名为 item 的属性。

使用for 循环

@for(int i = 0; i < Model.ExportingGroups.Count; i++)
{
  <tr>
    <td class="js-export-checkbox">
      @Html.CheckBoxFor(m => m.ExportingGroups[i].ToExport)
    </td>
  </tr>
}

现在你的 HTML 将是

<input name="ExportingGroups[0].ToExport" .../>
<input name="ExportingGroups[1].ToExport" .../>

等等。它将正确绑定到您的模型

编辑

或者,您可以将自定义 EditorTemplate 用于 typeof GroupToExport。创建局部视图/Views/Shared/EditorTemplates/GroupToExport.cshtml

@model yourAssembly.GroupToExport
<tr>
  <td class="js-export-checkbox">
    @Html.CheckBoxFor(m => m.ToExport)
  </td>
</tr>

然后在主视图中

@Html.EditorFor(m => m.ExportingGroups)

EditorFor() 方法将根据模板为集合中的每个项目生成正确的 html。

【讨论】:

  • You cannot use a foreach loop - 如果你在循环中使用EditorFor,你可以吗?
  • @jumpingcode,如果您使用 typeof GroupToExport 的编辑器模板,则您不需要(也不应该使用)foreach 循环 - 它只是 @Html.EditorFor(m =&gt; m.ExportingGroups)
  • 我同意,但你做了一个笼统的声明,在技术上是不正确的
  • @jumpingcode,这是真的(除非你要使用一些可怕的技巧来使它工作)
  • @jumpingcode,在你投反对票之前,我建议你尝试一下
【解决方案2】:

您使用不正确的语法在发布时将值映射回来,因为复选框的选中值默认初始化为 false,这就是它始终为 false 的原因,请使用 sysntax

@for(int i = 0; i < Model.ExportingGroups.Count(); i++)
            {
                <tr>
                    <td class="js-export-checkbox">
                        @Html.CheckBoxFor(modelItem => Model.ExportingGroups[i].ToExport)
                    </td>
                </tr>
            }
 //some divs

这应该映射回您正在寻找的所有值。

【讨论】:

    【解决方案3】:

    我发现这样效果更好:让 foreach 循环保持原样(不要使用计数器)

    @foreach (var item in Model.GroupToExport)
    {
    

    然后使用这种 Razor 格式显示一个复选框

    @Html.CheckBox("Active", @item.ToExport)
    

    使用简单,不会让您更改典型的 foreach 循环。

    【讨论】:

    • 这比上面过于复杂的答案要好得多。
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2019-12-10
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多