7

我需要帮助来构建 CheckBoxFor 以获得int价值。

就像是:

@Html.CheckBoxForInt(m => m.foo.intValue)

如果没有检查,则应检查intValue = 1

4

4 回答 4

15

你为什么不在你的模型中公开一个 bool 属性来转换成 int 或从 int 转换?

像这样的东西:

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

public int IntValue { get; set; }

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

@Html.CheckBoxFor(m => m.foo.BoolValue)
于 2012-11-22T18:48:23.820 回答
6

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

public int IntValue { get; set; }

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

这对我有用。

于 2013-05-23T16:31:05.313 回答
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);
    }
于 2018-01-30T10:14:28.050 回答
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);}

}
于 2020-10-17T10:10:59.413 回答