如何使用Html.Checkbox删除ASP.NET MVC中的重复组?

时间:2009-08-08 06:52:55

标签: asp.net-mvc

我正在努力使用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显示:

  • FormatException:String未被识别为有效的布尔值。
  • FormatException:Bobby不是布尔值的有效值。

当然“Bobby”不是布尔值,所以它失败了。关于为什么Html.Checkbox试图将“Bobby”用作布尔值的任何线索?相同的ViewModel适用于添加子项,因此我认为我没有错误。

2 个答案:

答案 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”):

  1. ViewData.ModelState [ “控件名称”]。Value.RawValue
  2. “value”参数传递给HTML帮助器方法,或者如果您调用了不包含“value”参数的重载,则ViewData.Eval(“controlName”)
  3. 由于我的表单是回发版,我的Html Helpers试图首先从ModelState获取它们的值。当您尝试删除Bobby时,一个示例结果是“Bobby,false”。这可能会以某种方式混淆Html.CheckBox,我现在不打算花时间调查。正如@darin指出的那样,没有Html Helpers的解决方法就可以了。

    自从我的模型正确以来,我无法弄清楚这一点。我甚至没想过要看看ModelState。在桑德森的书中我还没有阅读有关验证的部分,这可能没什么帮助。