2012-11-22 8 views
5

Ich brauche Hilfe, um eine CheckBoxFor zu erstellen, die einen Int-Wert erhalten.Wie kann ich eine CheckBox für int verwenden?

So etwas wie: @ Html.CheckBoxForInt (m => m.foo.intValue)

Es sollte geprüft werden, ob intValue = 1 sonst nicht geprüft

Thx

Antwort

12

Warum gehst du nicht expose eine Bool-Eigenschaft in Ihrem Modell, die konvertiert zu/von der Int?

Etwas wie folgt aus:

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

public int IntValue { get; set; } 

Dann könnten Sie es verwenden, um die Checkbox

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

Aus irgendeinem Grund zu schaffen, die Antwort gab über mir Fehler, sondern basiert auf der gleichen Idee, die ich Änderung habe der Code wie folgt:

public int IntValue { get; set; } 

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

und das funktioniert für mich.

0

Hier ist das Kontrollkästchen Helfer Beispiel für int-Werte Umgang:

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); 
    }