.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;"); 是为了让显示更好看的,如果在你的样式下面位置不好看你可以把这行去掉

posted @ 2011-07-07 15:27  无记  阅读(4310)  评论(11编辑  收藏  举报