我遇到了问题,无法找到解决方案。 我正在使用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();
}
在Controller中提交&#34; ToExport&#34;后,每个群组总是有价值&#39; false&#39;。即使检查了所有组。
有人能帮助我吗?我做错了什么?
答案 0 :(得分:10)
您不能使用foreach
循环来为集合生成控件。您为每个复选框(以及关联的隐藏输入)生成的html是<input type="checkbox" name="item.ToExport" .../>
。您的模型不包含名为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
用于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。
答案 1 :(得分:4)
您使用不正确的语法在发布时将值映射回来,因为默认情况下复选框的选中值初始化为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
这应该映射您要查找的所有值。
答案 2 :(得分:0)
我发现这更好用:保持foreach循环不变(不要使用计数器)
@foreach (var item in Model.GroupToExport)
{
然后使用这种Razor格式显示一个复选框
@Html.CheckBox("Active", @item.ToExport)
易于使用,不会改变典型的foreach循环。