我正在努力使用ASP.NET MVC中的Html.Checkbox。想象一下有一群重复孩子的员工:
alt text http://img220.imageshack.us/img220/7208/deletechildrensnapshotk.png
“添加孩子”按钮工作正常,但我无法可靠地使用“删除所选孩子”。我用以下方式渲染复选框:
<% int i = 0; %>
<% foreach (var item in Model.Children) { %>
<tr>
<td>
<%=Html.CheckBox("childrenToDelete[" + i + "]", false, new {value = item.Name})>
</td>
</tr>
<% i++; %>
<% } %>
以下是我的控制器操作如何获取要从FormCollection中删除的子项列表:
var childrenToDelete = new List<string>();
UpdateModel(childrenToDelete, "childrenToDelete");
然后我使用ViewModel模式创建一个对象,该模式包含Employee和List of Child。我无法弄清楚为什么85%的时间我会在Html.Checkbox行的View中抛出一个异常。大约15%的时间,它工作正常。例外情况是“从类型'System.String'到类型'System.Boolean'的参数转换失败。”然后IE显示:
当然“Bobby”不是布尔值,所以它失败了。关于为什么Html.Checkbox试图将“Bobby”用作布尔值的任何线索?相同的ViewModel适用于添加子项,因此我认为我没有错误。
答案 0 :(得分:4)
Html.CheckBox助手为表单添加了一个隐藏字段。我建议你为Children集合中的每个元素分配一个唯一的标识符,然后在你的表单中使用它而不是使用帮助器:
<% foreach (var child in Model.Children) { %>
<input type="checkbox" name="childrenToDelete" value="<%=child.Id%>" />
<%}%>
然后在你的控制器动作中:
public ActionResult DeleteChildren(string[] childrenToDelete)
{
// childrenToDelete array will contain selected ids of children to delete
return View();
}
答案 1 :(得分:0)
最后,我想我已经明白了。我没有意识到Html Helpers从以下位置获得了他们的价值(引自Steven Sanderson的“Pro ASP.NET MVC Framework”):
由于我的表单是回发版,我的Html Helpers试图首先从ModelState获取它们的值。当您尝试删除Bobby时,一个示例结果是“Bobby,false”。这可能会以某种方式混淆Html.CheckBox,我现在不打算花时间调查。正如@darin指出的那样,没有Html Helpers的解决方法就可以了。
自从我的模型正确以来,我无法弄清楚这一点。我甚至没想过要看看ModelState。在桑德森的书中我还没有阅读有关验证的部分,这可能没什么帮助。