How do I render a group of checkboxes using MVC 4 and View Models (strongly typed)

后端 未结 3 1104
谎友^
谎友^ 2021-02-01 06:35

I\'m rather new to the ASP.net MVC world and I\'m trying to figure out how to render a group of checkboxes that are strongly typed to a view model. In webforms I would just use

3条回答
  •  走了就别回头了
    2021-02-01 07:17

    Use a string array in your view model. You can then use the helper I hacked together. if you don't want to use the helper and the enum then see the actual Html at the bottom. The binder will return a string array with only the selected string values in it. if none are selected it returns a null value for your array. You must account for that, you have been warned :)

    View Model:

    [Display(Name = "Which Credit Cards are Accepted:")]
            public string[] CreditCards { get; set; }
    

    Helper:

    public static HtmlString CheckboxGroup(this HtmlHelper htmlHelper, Expression> propertySelector, Type EnumType)
            {
                var groupName = GetPropertyName(propertySelector);
                var modelValues = ModelMetadata.FromLambdaExpression(propertySelector, htmlHelper.ViewData).Model;//propertySelector.Compile().Invoke(htmlHelper.ViewData.Model);
            StringBuilder literal = new StringBuilder();  
    
            foreach (var value in Enum.GetValues(EnumType))
            {
                var svalue = value.ToString();
                var builder = new TagBuilder("input");
                builder.GenerateId(groupName);
                builder.Attributes.Add("type", "checkbox");
                builder.Attributes.Add("name", groupName);
                builder.Attributes.Add("value", svalue);
                var contextValues = HttpContext.Current.Request.Form.GetValues(groupName);
                if ((contextValues != null && contextValues.Contains(svalue)) || (modelValues != null && modelValues.ToString().Contains(svalue)))
                {
                    builder.Attributes.Add("checked", null);
                }
    
                literal.Append(String.Format("
    {1} {0}", svalue.Replace('_', ' '),builder.ToString(TagRenderMode.Normal))); } return (HtmlString)htmlHelper.Raw(literal.ToString()); } private static string GetPropertyName(Expression> propertySelector) { var body = propertySelector.Body.ToString(); var firstIndex = body.IndexOf('.') + 1; return body.Substring(firstIndex); }

    HTML:

    @Html.CheckboxGroup(m => m.CreditCards, typeof(VendorCertification.Enums.CreditCardTypes))
    

    Use this if helper extensions scare you:

                
                 Visa
     MasterCard

提交回复
热议问题