2009-08-08 49 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