您的位置:首页 > 编程学习 > ASP.NET

MVC扩展HtmlHelper实现CheckBoxList

更多 2016/4/1 来源:ASP.NET学习浏览量:2065
学习标签: MVC
本文导读:传统的ASP.NET具有一组重要的控件类型叫做列表控件,它的子类就包括CheckBoxList。对于ASP.NET MVC来说,我们可以通过HtmlHelper的扩展方法来实现CheckBoxList和CheckBoxListFor,从而在界面上呈现一个复选列表框。

CheckBoxList在Web页面应用非常广泛,在传统的ASP.NET aspx中系统自带有CheckBoxList控件,但是在MVC Razer中没有提供,下面介绍通过扩展HtmlHelper实现CheckBoxList的方法

 

 
C# 代码   复制

public static class CheckBoxListHelper
    {
        public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, bool isHorizon = true)
        {
            return CheckBoxList(helper, name, helper.ViewData[name] as IEnumerable<SelectListItem>, new { }, isHorizon);
        }

        public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList, bool isHorizon = true)
        {
            return CheckBoxList(helper, name, selectList, new { }, isHorizon);
        }

        public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, bool isHorizon = true)
        {
            string[] propertys  = expression.ToString().Split(".".ToCharArray());
            string id = string.Join("_", propertys, 1, propertys.Length - 1);
            string name = string.Join(".", propertys, 1, propertys.Length - 1);

            return CheckBoxList(helper, id, name, selectList, new { }, isHorizon);
        }

        public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isHorizon = true)
        {
            return CheckBoxList(helper, name, name, selectList, htmlAttributes, isHorizon);
        }

        public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string id, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isHorizon = true)
        {
            IDictionary<string, object> HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

            HashSet<string> set = new HashSet<string>();
            List<SelectListItem> list = new List<SelectListItem>();
            string selectedValues = (selectList as SelectList).SelectedValue == null ? string.Empty : Convert.ToString((selectList as SelectList).SelectedValue);
            if (!string.IsNullOrEmpty(selectedValues))
            {
                if (selectedValues.Contains(","))
                {
                    string[] tempStr = selectedValues.Split(',');
                    for (int i = 0; i < tempStr.Length; i++)
                    {
                        set.Add(tempStr[i].Trim());
                    }

                }
                else
                {
                    set.Add(selectedValues);
                }
            }

            foreach (SelectListItem item in selectList)
            {
                item.Selected = (item.Value != null) ? set.Contains(item.Value) : set.Contains(item.Text);
                list.Add(item);
            }
            selectList = list;

            HtmlAttributes.Add("type", "checkbox");
            HtmlAttributes.Add("id", id);
            HtmlAttributes.Add("name", name);
            HtmlAttributes.Add("style", "border:none;");

            StringBuilder stringBuilder = new StringBuilder();

            foreach (SelectListItem selectItem in selectList)
            {
                IDictionary<string, object> newHtmlAttributes = HtmlAttributes.IDictionaryCopy();
                newHtmlAttributes.Add("value", selectItem.Value);
                if (selectItem.Selected)
                {
                    newHtmlAttributes.Add("checked", "checked");
                }

                TagBuilder tagBuilder = new TagBuilder("input");
                tagBuilder.MergeAttributes<string, object>(newHtmlAttributes);
                string inputAllHtml = tagBuilder.ToString(TagRenderMode.SelfClosing);
                string containerFormat = isHorizon ? @"<label> {0}  {1}</label>" : @"<p><label> {0}  {1}</label></p>";
                stringBuilder.AppendFormat(containerFormat,
                   inputAllHtml, selectItem.Text);
            }
            return MvcHtmlString.Create(stringBuilder.ToString());

        }
        private static IDictionary<string, object> IDictionaryCopy(this IDictionary<string, object> ht)
        {
            Dictionary<string, object> _ht = new Dictionary<string, object>();

            foreach (var p in ht)
            {
                _ht.Add(p.Key, p.Value);
            }
            return _ht;
        } 
    }

 

调用方式

 

  
C# 代码   复制


            
@Html.CheckBoxList("保存SelectList的ViewData名称")

或者

@Html.CheckBoxList("CheckBoxList名称",new SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue),是否水平显示)

或者
@Html.CheckBoxList("CheckBoxList名称",new SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue),其它html属性,是否水平显示)
 
 
 

@Html.CheckBoxListFor(m => m.aaa, new SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue),是否水平显示)

 

收藏
497
很赞
67