剃刀中的多个复选框(使用foreach)

我有一个问题,我找不到解决方案。 我正在使用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 ExportingGroups { get; set; } } 

视图:

 @using (Html.BeginForm("Export", "ElmahGroup", FormMethod.Post, new { id = "toExportForm" })) { //some divs  @foreach (var item in Model.ExportingGroups) {   @Html.CheckBoxFor(modelItem => item.ToExport)   } //some divs } 

控制器:

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

在Controller中提交“ToExport”之后,每个组的值都为’false’。 即使检查了所有组。

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

您不能使用foreach循环来为集合生成控件。 您为每个复选框(以及相关的隐藏输入)生成的html是 。 您的模型不包含名为item的属性。

使用for循环

 @for(int i = 0; i < Model.ExportingGroups.Count; i++) {   @Html.CheckBoxFor(m => m.ExportingGroups[i].ToExport)   } 

现在你的HTML将是

   

等将正确绑定到您的模型

编辑

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

 @model yourAssembly.GroupToExport   @Html.CheckBoxFor(m => m.ToExport)   

然后在主视图中

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

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

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

 @for(int i = 0; i < Model.ExportingGroups.Count(); i++) {   @Html.CheckBoxFor(modelItem => Model.ExportingGroups[i].ToExport)   } //some divs 

这应该映射您要查找的所有值。

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

 @foreach (var item in Model.GroupToExport) { 

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

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

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