2009-03-09 10 views
2

既存のHTMLヘルパーを使用して明示的な値を持つチェックボックスのリストを生成する簡単な方法はありますか? (おそらくMVC Contribの付き)のベータ版でASP.net MVC RC2 - 明示的な値を持つチェックボックス

例:

.CheckBox("Field", 6, new { value = 6})だろう出力:RC2でまだ

<input id="Field1" type="checkbox" value="6" name="Field" /> 
<input id="Field2" type="hidden" value="6" name="Field" /> 

私が取得:

<input id="Field1" type="checkbox" value="6" name="Field" /> 
<input type="hidden" value="false" name="Field" /> 

NB:私はカスタムを使用独自のHTML idおよび を生成するヘルパー拡張子 チェックするHTML属性がsのとき 適切な

のHTMLヘルパーを使用して、生のHTMLを使用していないだけでなく、明示的な値を持つチェックボックス を設定する方法はありますか? RC2のCodeplexソースコードを見ると、privateと表示されているので、簡単な方法ではないようです。

NB:複数の選択を許可するページにはcheckboxが1つ以上あるため、falseの値は使用されません。隠しフィールドの値が必要なので、どの項目がチェックされていないかを知る必要があります。チェックされていないcheckbox値は転記されません - 隠しフィールドのみです)。

答えて

0

 
private static string CheckBoxWithValue(this HtmlHelper htmlHelper, string name, object value, bool isChecked, bool setId, IDictionary htmlAttributes) 
     { 
      const InputType inputType = InputType.CheckBox; 
      if (String.IsNullOrEmpty(name)) 
      { 
       throw new ArgumentException("null or empty error", "name"); 
      } 

      var tagBuilder = new TagBuilder("input"); 
      tagBuilder.MergeAttributes(htmlAttributes); 
      tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); 
      tagBuilder.MergeAttribute("name", name, true); 
      string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture); 

      if (isChecked) 
      { 
       tagBuilder.MergeAttribute("checked", "checked"); 
      } 
      tagBuilder.MergeAttribute("value", valueParameter, true); 
      if (setId) tagBuilder.GenerateId(name); 

      // If there are any errors for a named field, we add the css attribute. 
      ModelState modelState; 
      if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) 
      { 
       if (modelState.Errors.Count > 0) 
       { 
        tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); 
       } 
      } 
      var inputItemBuilder = new StringBuilder(); 
      inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing)); 

      var hiddenInput = new TagBuilder("input"); 
      hiddenInput.MergeAttributes(htmlAttributes); 
      hiddenInput.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden)); 
      hiddenInput.MergeAttribute("name", name); 
      if (setId) 
      { 
       hiddenInput.GenerateId(name); 
      } 
      hiddenInput.MergeAttribute("value", valueParameter); 

      inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing)); 
      return inputItemBuilder.ToString(); 

     } 

これは.ToString(に依存している)あなたの評価対象の私のシナリオでは、バックエンドデータベースで行われた検索でオプションを表すために整数を使用するのに適しています。 setId booleanは、Html名のドットをアンダースコアで置き換えるように見えることに注意してください。 HTMLで複数のチェックボックスを使用する場合、IDは一意である必要があります。そのため、代わりにhtmlAttributesコレクションを介して一意のIDを渡します。

+0

私は別のパブリックヘルパーメソッドでこれをラップし、modelSate/viewdataからisChecked Valueを設定しました。これはなぜプライベートとしてマークされているのか不思議です。 –

0

フィールドのマップ先プロパティがInt型の場合、falseは0に変換されます。

これは、ボックスがどのようにチェックされたかを知る方法です。私は、次のRC2のソースコードのInputHelper法に緩く基づいていますが、複数の値を許可するように適応して作ってみた回避策として

0

「通常の」ASP.Netから最近MVCを使い始めたのであれば、まっすぐなHTMLの入力を避けることが非常に賢明かもしれませんが、MVC世界ではそれほど問題はありません任意のviewstateや他の問題と争う長い。だから、もしあなたが整数だけを扱っているならば、あなたは望むならば、まっすぐなHTMLを自由に使うように気をつけてください(JavaScriptの注入などについて心配する必要はありません)。