2011-11-11 5 views
2

に至るまで、チェックボックスの選択を渡す:現時点で私は、彼らがグリッドに表示する列を指定するために、ユーザーのために使用されているチェックボックスの束持って行動

columnselector

を、それぞれチェックボックスがあり(基本的にそれのラベル名です)と私の見解では、このように宣言され、それ自身のキー:

@Html.CheckBox(column.Key, 
       (Request.Form[column.Key] == null ? true : 
       Request.Form[column.Key].Contains("true")), 
       new { @class = "columnSelector" }) 

@Html.Label(column.HeaderText) 

問題は、そうでない場合は、私が持っているだろうと私は、私のアクションでフォームコレクションから値を取得する必要がありますにはすべての列セレクタのチェックボックスに0のパラメータ。別の方法として、それらをすべて「列選択」などの名前にして、それを値の配列としてアクションに渡すことができると思ったが、列キーがないので値のコンテキストを失う。

各チェックボックスのプロパティを持つビューモデルを作成する必要はありません。この機能は異なる列の他の画面で使用されているため、一般的なままにしておきたいと思います。

どのように私はこの列選択のものを清潔で簡単な方法で達成することができたか考えていますか?

答えて

1

Html.CheckBoxメソッドには奇妙な実装があります。チェックボックスには一意のnameがあり、本質的にはtrue/falseという値になります。これは、値がアクション内のboolパラメータに簡単にマップされるようにするためです。

明らかに気づいたように、これはチェックボックスが動的な場合には厄介な状況になります。

解決策は、共通のnameを使用し、ユニークなvalueを使用して、独自のチェックボックスを生成することです。これらはあなたの行動に非常にうまく対応します!

See this question too, for some great examples and explanations。ここで

は、望ましい行動です:

public ActionResult SetSelectedColumns(string[] selectedColumns) { 
    // selectedColumns will contain the keys of all the checked columns. 
} 

そしてここでは、あなたのHTMLを正しくマッピングするために取得する方法は次のとおりです。

<input type="checkbox" name="selectedColumns" value="@column.Key" @(column.Selected ? "checked='checked'" : "") /> 

私は非常また、あなたができるように、拡張メソッドにこの機能を置くことをお勧めしますModelStateおよびhtmlAttributesを組み込む。ここに私の試練はありません:

public static HtmlString CheckBoxAlt(this HtmlHelper html, string name, string value, bool selected, object htmlAttributes) 
    { 
     var tag = new TagBuilder("input"); 
     if (htmlAttributes != null) 
      tag.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     tag.MergeAttribute("type", "checkbox"); 
     tag.MergeAttribute("name", name); 
     tag.MergeAttribute("value", value); 
     // Determine if this check should be selected: 
     var state = html.ViewData.ModelState[name]; 
     if (state != null) 
     { 
      var values = (string[])state.Value.ConvertTo(typeof(string[])); 
      selected = Array.IndexOf(values, value) != -1; 
     } 
     if (selected) 
      tag.MergeAttribute("checked", "checked"); 

     return new HtmlString(tag.ToString(TagRenderMode.SelfClosing)); 
    } 
+0

ええ、それは私が今ダウンする道です。あなたはあなたの答えの拡張メソッドの部分について詳しく説明できますか? – link664

+0

@ link664私はあなたのための拡張方法を書いた!お楽しみください:) –

+0

おかげで@スコットリッピー、魅力のように動作します! – link664

関連する問題