2012-11-22 25 views

回答

12

你为什么不在你的模型中暴露一个bool属性来转换为/从int?

事情是这样的:

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

public int IntValue { get; set; } 

然后,你可以用它来创建复选框

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

出于某种原因,上面的反应给了我的错误,而是基于我已经改变了同样的想法代码是这样的:

​​

那对我有用。

0

下面是处理int类型的复选框帮手例如:

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