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