2009-08-08 2 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"); 

私は、従業員が含まれているのViewModelパターンを使用してオブジェクトを作成します子どものリスト。なぜ85%の時間がHtml.Checkbox行のViewに例外をスローするのかわかりません。時間の約15%、それは正常に動作します。例外は「タイプ 'System.String'からタイプ 'System.Boolean'へのパラメータ変換に失敗しました。 IEは次に表示します:

  • FormatException:文字列が有効なブール値として認識されませんでした。
  • FormatException:BobbyがBooleanの有効な値ではありません。

もちろん、「Bobby」はブール値ではないため、失敗します。 Html.Checkboxが "Bobby"をブール値として使用しようとしている理由についての手掛かりはありますか?同じViewModelが子を追加するために正常に動作するので、私はそこにエラーがあるとは思わない。

+0

あなたのPOSTアクションからすべてのコードを投稿してください。 –

+0

@ eu-ge-ne:ここにあります:http://pastebin.ca/1522362 – royco

+0

更新:リスト内の最後の子をいつでも削除できるようです。ViewModelに渡すnewChildrenオブジェクトには、常に正しい子リストが更新されています。私はここに適切な戦略を持っていると思うが、どこかにバグがあるに違いない。 – royco

答えて

0

:あなたのコントローラのアクションで

<% foreach (var child in Model.Children) { %> 
    <input type="checkbox" name="childrenToDelete" value="<%=child.Id%>" /> 
<%}%> 

そして:私はあなたが子供のコレクション内の各要素に一意の識別子を割り当て、その後、フォームでこれを持っている代わりにヘルパーを使用することをお勧めし長い間、私はそれを理解したと思う。私は、HTMLヘルパーは、(スティーブン・サンダーソンによる「プロASP.NET MVCフレームワーク」から引用)以下の場所から値を取得することを実現しませんでした:

  1. ViewData.ModelState [「コントロール名」] Value.RawValue
  2. 。 HTMLヘルパーメソッドに渡さ
  3. 「値」パラメータ、またはあなたが「値」パラメータを含んでいない過負荷、そしてViewData.Eval(「コントロール名を」)と呼ばれてきた場合

私のフォームがあるので、ポストバック、私のHtmlヘルパーは、まずModelStateから値を取得しようとしました。たとえば、Bobbyを削除しようとすると、「Bobby、false」という結果が表示されます。それはHtml.CheckBoxを何らかの形で混乱させる可能性があるので、私は今調査する時間を取るつもりはない。 @ダリンが指摘するように、Htmlヘルパーなしの回避策はうまくいきます。

私のモデルが正しいので、これは最長の時間内に把握できませんでした。私はModelStateを見ることさえ考えなかった。おそらく私がSandersonの本の検証のセクションをまだ読んでいなかったことを助けなかったでしょう。

4

Html.CheckBoxヘルパーは、フォームに非表示のフィールドを追加します。で

public ActionResult DeleteChildren(string[] childrenToDelete) 
{ 
    // childrenToDelete array will contain selected ids of children to delete 
    return View(); 
} 
+0

これは私が過去に使った戦略です。 MVCのヘルパーのほんの一部が物事をより複雑にしているように思えるのは残念です。 –

+0

@ダリン:これは私が最初にやろうとしたことですが、私はUpdateModel()を使用しなくてはなりませんが、フォームから他のデータをポストバックしました。私は、おそらくFormCollectionの中にデータが入ってきた場合に、アクションメソッドのパラメータとして配列を使う方法を見ていません。何か案は? – royco