为MVC3扩展CheckBoxList和RadioButtonList
在WebForm时代,CheckBoxList和RadioButtonList都非常容易实现。不得不承认,这两个控件还是非常实用的。
但是在MVC中并没有相关的支持,可能微软觉得没必要了吧,不过真的有人讲这个功能完成了。
代码摘抄自狼奔代码生成器。地址是:http://www.cnblogs.com/langben 有兴趣的可以研究下。
CheckBoxListHelper:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Mvc; using System.Linq.Expressions; namespace Models { public static class CheckBoxListHelper { /// <summary> /// CheckBox列表 /// </summary> /// <param name="helper">辅助类</param> /// <param name="name">字段名称</param> /// <param name="selectList">集合</param> /// <returns></returns> public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList) { return CheckBoxList(helper, name, selectList, new { }); } /// <summary> /// CheckBox列表 /// </summary> /// <param name="helper">辅助类</param> /// <param name="name">字段名称</param> /// <param name="selectList">集合</param> /// <param name="htmlAttributes">html标签</param> /// <returns></returns> 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; } } }
RadioButtonListHelper:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Mvc; using System.Linq.Expressions; namespace Models { public static class RadioButtonListHelper { /// <summary> /// Radio列表 /// </summary> /// <param name="htmlHelper">辅助类</param> /// <param name="selectList">集合</param> /// <param name="htmlAttributes">html标签</param> /// <param name="isChecked">默认单选状态</param> /// <returns></returns> public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isChecked = false) { string name = ExpressionHelper.GetExpressionText(expression); return RadioButtonList(htmlHelper, name, selectList, htmlAttributes,isChecked); } /// <summary> /// Radio列表 /// </summary> /// <param name="htmlHelper">辅助类</param> /// <param name="selectList">集合</param> /// <param name="isChecked">默认单选状态</param> /// <returns></returns> public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, bool isChecked = false) { string name = ExpressionHelper.GetExpressionText(expression); return RadioButtonList(htmlHelper, name, selectList, new { },isChecked); } /// <summary> /// Radio列表 /// </summary> /// <param name="htmlHelper">辅助类</param> /// <param name="name">字段名称</param> /// <param name="selectList">集合</param> /// <param name="htmlAttributes">html标签</param> /// <param name="isChecked">默认单选状态</param> /// <returns></returns> public static MvcHtmlString RadioButtonList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isChecked = false) { IDictionary<string, object> HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); string defaultValue = string.Empty; if (htmlHelper.ViewData.Model != null) { if (!string.IsNullOrWhiteSpace(name)) { defaultValue = htmlHelper.ViewData.Eval(name) + ""; } isChecked = false; } StringBuilder str = new StringBuilder(); foreach (SelectListItem item in selectList) { str.Append("<input "); if (item.Value == defaultValue) { str.Append("checked='checked' "); } if (isChecked) { str.Append(" checked=true "); isChecked = false; } foreach (var bute in HtmlAttributes) { str.Append(bute.Key + "=\"" + bute.Value); } str.Append("\" id=\"" + item.Value + "\" type=\"radio\" value=\"" + item.Value + "\" name=\"" + name + "\"/>"); str.Append(item.Text); } return MvcHtmlString.Create(str.ToString()); } } }