Asp.net mvc 如何在MVC中使用复选框列表

Asp.net mvc 如何在MVC中使用复选框列表,asp.net-mvc,Asp.net Mvc,我需要显示包含多个选项的复选框列表。用户必须至少选择一个复选框,用户可以选择多个复选框 我想将一个字段中所有复选框(选中)的值存储为字符串(数据库),并用逗号分隔。这不是强制性的,强制性的是需要存储每个选中复选框的多个值。欢迎其他解决方案 模型 公共类成员 { 公共字符串成员\u车辆类型{get;set;} 公共IList成员\u车辆类型\u列表{get;set;} 控制器 [HttpGet] 公共操作结果创建() { 成员objMemberModel=新成员(); 列出车辆类型=新列表();

我需要显示包含多个选项的复选框列表。用户必须至少选择一个复选框,用户可以选择多个复选框

我想将一个字段中所有复选框(选中)的值存储为字符串(数据库),并用逗号分隔。这不是强制性的,强制性的是需要存储每个选中复选框的多个值。欢迎其他解决方案

模型

公共类成员
{
公共字符串成员\u车辆类型{get;set;}
公共IList成员\u车辆类型\u列表{get;set;}
控制器

[HttpGet]
公共操作结果创建()
{
成员objMemberModel=新成员();
列出车辆类型=新列表();
添加(新的SelectListItem{Text=“Two-Wheeler”,Value=“1”});
添加(新的SelectListItem{Text=“Four Wheeler”,Value=“2”});
objMemberModel.Member_VehicalType_List=车辆类型;
返回视图(objMemberModel);

如何使用
@Html.CheckBoxFor(
@Html.CheckBoxFor(

我最近不得不将
SelectListItem
作为复选框列表处理。我提出了以下HtmlExtensions,这可能会有所帮助。这些扩展提供了与
@Html.DropDownListFor(model=>)相同的功能;

用法:
@Html.CheckBoxListFor(model=>model.ModelMemberToPutValueIn,model.Member\u vehiclealtype\u列表)

public静态类
{
public static MvcHtmlString CheckBoxListFor(此HtmlHelper HtmlHelper、表达式、IEnumerable项、对象htmlAttributes=null)
{
var listName=ExpressionHelper.GetExpressionText(表达式);
var metaData=modelmetada.FromLambdaExpression(表达式,htmlHelper.ViewData);
items=GetCheckboxListWithDefaultValue(metaData.Model,items);
返回htmlHelper.CheckBoxList(列表名、项目、htmlAttributes);
}
公共静态MvcHtmlString复选框列表(此HtmlHelper HtmlHelper、字符串列表名、IEnumerable项、对象htmlAttributes=null)
{
如果(items==null)返回null;
var容器=新标记生成器(“div”);
container.AddCssClass(“复选框列表”);
container.MergeAttribute(“id”,HtmlHelper.GenerateIdFromName(listName));
foreach(项目中的var项目)
{
var id=HtmlHelper.GenerateIdFromName(String.Join(“.”,listName,item.Text));
var div=新标记生成器(“div”);
div.AddCssClass(“复选框”);
var cb=新标记生成器(“输入”);
合并属性(“类型”、“复选框”);
cb.合并属性(“id”,id);
cb.MergeAttribute(“名称”,列表名称);
cb.MergeAttribute(“值”,item.value??item.Text);
如果(选中项)cb.MERGETRITY(“选中”、“选中”);
var标签=新标记生成器(“标签”);
label.MergeAttribute(“for”,id);
label.MergeAttributes(新的RouteValueDictionary(htmlAttributes),true);
label.InnerHtml=item.Text;
div.InnerHtml=cb.ToString(TagRenderMode.SelfClosing)+标签;
container.InnerHtml+=div;
}
返回新的MvcHtmlString(container.ToString());
}
私有静态IEnumerable GetCheckboxListWithDefaultValues(对象默认值,IEnumerable selectList)
{
var defaultValuesList=默认值为IEnumerable;
如果(defaultValuesList==null)返回selectList;
var values=从defaultValuesList中的对象值选择Convert.ToString(值,CultureInfo.CurrentCulture);
var selectedValues=newhashset(值,StringComparer.OrdinalIgnoreCase);
var newSelectList=新列表();
foreach(选择列表中的变量项)
{
item.Selected=(item.Value!=null)?selectedValues.Contains(item.Value):selectedValues.Contains(item.Text);
新闻选择列表。添加(项);
}
返回新闻列表;
}
}

SelectListItem
用于dropdownlist(不是复选框)。为您的收藏创建视图模型查看ASP.Net标识示例,这些示例使用了
SelectList
s,然后从中输出复选框。非常感谢@StephenMuecke您能为收藏的视图模型提供一些代码片段吗?创建一个具有3个属性的视图模型(例如)
int-ID;string-Name;bool-IsSelected;
然后(假设)
公共列表选项{get;set;}
并使用
for
循环将复选框绑定到
IsSelected
属性
public class Member
{
      public string Member_VehicalType { get; set; }
      public IList<SelectListItem> Member_VehicalType_List { get; set; }  
    [HttpGet]
    public ActionResult Create()
    {
        Member objMemberModel = new Member();            
        List<SelectListItem> vehical_Types = new List<SelectListItem>();
        vehical_Types.Add(new SelectListItem { Text = "Two Wheeler", Value = "1" });
        vehical_Types.Add(new SelectListItem { Text = "Four Wheeler", Value = "2" });
        objMemberModel.Member_VehicalType_List = vehical_Types;
        return View(objMemberModel);
public static class HtmlExtensions
{
    public static MvcHtmlString CheckBoxListFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> items, object htmlAttributes = null)
    {
        var listName = ExpressionHelper.GetExpressionText(expression);
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        items = GetCheckboxListWithDefaultValues(metaData.Model, items);

        return htmlHelper.CheckBoxList(listName, items, htmlAttributes);
    }

    public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string listName, IEnumerable<SelectListItem> items, object htmlAttributes = null)
    {
        if (items == null) return null;

        var container = new TagBuilder("div");
        container.AddCssClass("checkbox-list");
        container.MergeAttribute("id", HtmlHelper.GenerateIdFromName(listName));

        foreach (var item in items)
        {
            var id = HtmlHelper.GenerateIdFromName(String.Join(".", listName, item.Text));
            var div = new TagBuilder("div");
            div.AddCssClass("checkbox");

            var cb = new TagBuilder("input");
            cb.MergeAttribute("type", "checkbox");
            cb.MergeAttribute("id", id);
            cb.MergeAttribute("name", listName);
            cb.MergeAttribute("value", item.Value ?? item.Text);
            if (item.Selected) cb.MergeAttribute("checked", "checked");

            var label = new TagBuilder("label");
            label.MergeAttribute("for", id);
            label.MergeAttributes(new RouteValueDictionary(htmlAttributes), true);
            label.InnerHtml = item.Text;

            div.InnerHtml = cb.ToString(TagRenderMode.SelfClosing) + label;
            container.InnerHtml += div;
        }

        return new MvcHtmlString(container.ToString());
    }

    private static IEnumerable<SelectListItem> GetCheckboxListWithDefaultValues(object defaultValues, IEnumerable<SelectListItem> selectList)
    {
        var defaultValuesList = defaultValues as IEnumerable;
        if (defaultValuesList == null) return selectList;

        var values = from object value in defaultValuesList select Convert.ToString(value, CultureInfo.CurrentCulture);
        var selectedValues = new HashSet<string>(values, StringComparer.OrdinalIgnoreCase);
        var newSelectList = new List<SelectListItem>();

        foreach (var item in selectList)
        {
            item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text);
            newSelectList.Add(item);
        }

        return newSelectList;
    }
}