2009-08-08 41 views
1

我正在努力与ASP.NET MVC中的Html.Checkbox。想象一下,一个雇员与儿童的重复组:如何使用Html.Checkbox删除ASP.NET MVC中的重复组?

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"); 

我然后创建使用包含员工的视图模型图案的物体和一张儿童名单。我无法弄清楚为什么85%的时间我在Html.Checkbox行的View中抛出异常。大约15%的时间,它工作正常。例外是“从类型'System.String'到类型'System.Boolean'的参数转换失败。” IE然后显示:

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

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

+0

发布你的POST动作的所有代码,请 – 2009-08-08 10:14:47

+0

@ eu-ge-ne:它是:http://pastebin.ca/1522362 – royco 2009-08-08 22:35:32

+0

更新:它看起来像我总是可以删除列表中的最后一个孩子。我传递给ViewModel的newChildren对象始终拥有正确和更新的子级列表。我想我在这里有正确的策略,但我必须在某个地方有一个bug。 – royco 2009-08-08 22:40:16

回答

0

在最后,我想我明白了。我不知道,HTML辅助从以下位置(由史蒂芬·桑德森从“临ASP.NET MVC框架”援引)得到他们的价值观:

  1. ViewData.ModelState [“控件名称”] Value.RawValue
  2. “值”参数传递给HTML helper方法,或者如果你叫过载不包含一个“值”参数,然后ViewData.Eval(“控件名称”)

由于我的形式是回来后,我的Html Helpers试图首先从ModelState获取它们的值。当您尝试删除Bobby时,示例结果是“Bobby,false”。这可能会以某种方式混淆Html.CheckBox,我现在不打算花时间进行调查。正如@darin所指出的,没有Html Helpers的解决方法工作得很好。

自从我的模型正确以来,我无法弄清楚这是否是最长的时间。我甚至没有想过看ModelState。这可能没有帮助,因为我还没有阅读Sanderson书中关于验证的部分。

4

Html.CheckBox助手向表单中添加一个隐藏字段。我建议你把一个唯一的标识符给孩子集合中的每个元素,然后有这个在您的形式,而不是使用助手:

<% 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(); 
} 
+0

这是我过去使用的策略。很遗憾MVC的一些帮手似乎让事情变得更加复杂。 – 2009-08-08 09:32:04

+0

@darin:这是我一开始试图做的,但是我从表单中发回了其他数据,尽管我不得不使用UpdateModel()。我不知道如何使用数组作为操作方法参数,如果我有更多的数据进来,也许在FormCollection中。有任何想法吗? – royco 2009-08-08 21:46:40