我怎么能用CheckBoxFor使用int?

时间:2012-11-22 15:45:01

标签: asp.net-mvc-3 razor custom-controls

我需要帮助来构建一个获取int值的CheckBoxFor。

类似:@ Html.CheckBoxForInt(m => m.foo.intValue)

应检查intValue = 1是否未检查

THX

4 个答案:

答案 0 :(得分:13)

为什么不在模型中公开转换为/从int?

的bool属性

这样的事情:

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

public int IntValue { get; set; }

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

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

答案 1 :(得分:6)

出于某种原因,上面的回复给了我错误,但基于同样的想法,我改变了这样的代码:

public int IntValue { get; set; }

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

这对我有用。

答案 2 :(得分: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");

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

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

        return MvcHtmlString.Create(checkbox.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);
    }

答案 3 :(得分:0)

一种略有不同的方法:

我的数据库需要接受一个int,我希望有一个复选框可以从Razor中的表单发送该int。在页面上,我还使用angularJS(也很容易只使用纯JS)。因此,这里提供的解决方案不涉及更改模型等。

形式:

<input ng-click="checkCheckBox()" type="checkbox" id="myCheck">

@Html.HiddenFor(m => m.Role, new { id = "id_checkbox", Value = 0 })

在javascript中:

$scope.checkCheckBox= function(){

   var x = document.getElementById("myCheck").checked;

   if (x == true) { $('#id_checkbox').val(3);}
   else { $('#id_checkbox').val(0);}

}