[转载].NET MVC3 中扩展一个HtmlHelper方法CheckBoxList – 单程列车 – 博客园.
MVC中有DropDownList方法,挺好用,可是最常用的需求,一组checkboxlist咋没个类似方法呢?郁闷之余,自己做一个吧,直接上代码,呵呵
public static MvcHtmlString CheckBoxList( this HtmlHelper helper, string name, IEnumerable selectList) { return CheckBoxList(helper, name, selectList, new { }); } public static MvcHtmlString CheckBoxList( this HtmlHelper helper, string name, IEnumerable selectList, object htmlAttributes) { IDictionary HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); HashSet set = new HashSet(); List list = new List (); 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 newHtmlAttributes = HtmlAttributes.DeepCopy(); newHtmlAttributes.Add( "value" , selectItem.Value); if (selectItem.Selected) { newHtmlAttributes.Add( "checked" , "checked" ); } TagBuilder tagBuilder = new TagBuilder( "input" ); tagBuilder.MergeAttributes(newHtmlAttributes); string inputAllHtml= tagBuilder.ToString(TagRenderMode.SelfClosing); stringBuilder.AppendFormat( @"<label> {0} {1}</label>" , inputAllHtml, selectItem.Text); } return MvcHtmlString.Create(stringBuilder.ToString()); } private static IDictionary DeepCopy( this IDictionary ht) { Dictionary _ht= new Dictionary(); 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;”); 是为了让显示更好看的,如果在你的样式下面位置不好看你可以把这行去掉