2012-11-22 17 views
5

Ho bisogno di aiuto per costruire un CheckBoxFor che ha un valore int.come posso avere un CheckBoxFor usando int?

Qualcosa di simile: @ Html.CheckBoxForInt (m => m.foo.intValue)

Va controllato se intValue = 1 altrimenti non controllato

Thx

risposta

12

Perché non si esporre una proprietà bool nel tuo modello che converte in/da int?

Qualcosa di simile a questo:

public bool BoolValue 
{ 
    get { return IntValue == 1; } 
    set { IntValue = value ? 1 : 0;} 
} 

public int IntValue { get; set; } 

allora si potrebbe utilizzare per creare la casella di controllo

@Html.CheckBoxFor(m => m.foo.BoolValue) 
6

Per qualche ragione la risposta di cui sopra mi ha dato errori, ma basato sulla stessa idea ho cambiamento il codice come questo:

public int IntValue { get; set; } 

public bool BoolValue 
{ 
    get { return IntValue == 1; } 
    set { 
      if(value) 
       IntValue = 1; 
      else 
       IntValue = 0; 
    } 
} 

e che funzionano per me.

0

Ecco l'esempio casella di controllo di supporto per valori int manipolazione:

public static MvcHtmlString CheckBoxIntFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, int>> expression, object htmlAttributes)   
    { 
     // get the name of the property 
     string[] propertyNameParts = expression.Body.ToString().Split('.'); 

     // create name and id for the control 
     string controlId = String.Join("_", propertyNameParts.Skip(1)); 
     string controlName = String.Join(".", propertyNameParts.Skip(1)); 

     // get the value of the property 
     Func<TModel, int> compiled = expression.Compile(); 
     int booleanSbyte = compiled(html.ViewData.Model); 

     // convert it to a boolean 
     bool isChecked = booleanSbyte == 1; 

     // build input element 
     TagBuilder checkbox = new TagBuilder("input"); 
     checkbox.MergeAttribute("id", controlId); 
     checkbox.MergeAttribute("name", controlName); 
     checkbox.MergeAttribute("type", "checkbox"); 
     checkbox.MergeAttribute("value", "0"); 

     if (isChecked) 
     { 
      checkbox.MergeAttribute("checked", "checked"); 
      checkbox.MergeAttribute("value", "1"); 
     } 
     SetStyle(checkbox, htmlAttributes); 

     TagBuilder hidden = new TagBuilder("input"); 
     hidden.MergeAttribute("name", controlName); 
     hidden.MergeAttribute("type", "hidden"); 
     hidden.MergeAttribute("value", "0"); 

     // script to handle changing selection 
     string script = "<script>" + 
          "$('#" + controlId + "').change(function() { " + 
           "if ($(this).is(':checked')) "+ 
            "$(this).val('1'); " + 
           "else " + 
            "$(this).val('0'); " + 
          "}); " + 
         "</script>"; 

     return MvcHtmlString.Create(checkbox.ToString(TagRenderMode.SelfClosing) + hidden.ToString(TagRenderMode.SelfClosing) + script); 
    } 

    private static void SetStyle(TagBuilder control, object htmlAttributes) 
    { 
     if(htmlAttributes == null) 
      return; 

     // get htmlAttributes 
     Type t = htmlAttributes.GetType(); 
     PropertyInfo classInfo = t.GetProperty("class"); 
     PropertyInfo styleInfo = t.GetProperty("style"); 
     string cssClasses = classInfo?.GetValue(htmlAttributes)?.ToString(); 
     string style = styleInfo?.GetValue(htmlAttributes)?.ToString(); 

     if (!string.IsNullOrEmpty(style)) 
      control.MergeAttribute("style", style); 
     if (!string.IsNullOrEmpty(cssClasses)) 
      control.AddCssClass(cssClasses); 
    } 
Problemi correlati