.NET MVC3 中扩展一个HtmlHelper方法CheckBoxList

MVC中有DropDownList方法,挺好用,可是最常用的需求,一组checkboxlist咋没个类似方法呢?郁闷之余,自己做一个吧,直接上代码,呵呵

  public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList)

        {

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

        }

  public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes)

       {



           IDictionary<string, object> HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);



           HashSet<string> set = new HashSet<string>();

           List<SelectListItem> list = new List<SelectListItem>();

           string selectedValues = 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]);

                   }



               }

               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", name);

           HtmlAttributes.Add("name", name);

           HtmlAttributes.Add("style", "margin:0 0 0 10px;line-height:30px; vertical-align:-8px;border:none;");



           StringBuilder stringBuilder = new StringBuilder();



           foreach (SelectListItem selectItem in selectList)

           {

               IDictionary<string, object> newHtmlAttributes = HtmlAttributes.DeepCopy();

               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);

               stringBuilder.AppendFormat(@"<label style=""margin:0 0 0 10px;""> {0}  {1}</label>",

                  inputAllHtml, selectItem.Text);

           }

           return MvcHtmlString.Create(stringBuilder.ToString());



       }

 private static IDictionary<string, object> DeepCopy(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;

       } 

 可以直接拿去用

生成的每一个checkbox外部都有一个label,感觉不错,不喜欢可以去掉,还有一个HtmlAttributes.Add("style", "margin:0 0 0 10px;line-height:30px; vertical-align:-8px;border:none;"); 是为了让显示更好看的,如果在你的样式下面位置不好看你可以把这行去掉

你可能感兴趣的:(checkbox)