主攻ASP.NET MVC4.0之重生:CheckBoxListHelper和RadioBoxListHelper的使用
在项目中新建Helpers文件夹,创建CheckBoxListHelper和RadioBoxListHelper类。
CheckBoxListHelper代码
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Web; using System.Web.Mvc; namespace SHH.Helpers { public static class CheckBoxListHelper { public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, bool isHorizon = true) { return CheckBoxList(helper, name, helper.ViewData[name] as IEnumerable<SelectListItem>, new { }, isHorizon); } public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList, bool isHorizon = true) { return CheckBoxList(helper, name, selectList, new { }, isHorizon); } public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, bool isHorizon = true) { string[] propertys = expression.ToString().Split(".".ToCharArray()); string id = string.Join("_", propertys, 1, propertys.Length - 1); string name = string.Join(".", propertys, 1, propertys.Length - 1); return CheckBoxList(helper, id, name, selectList, new { }, isHorizon); } public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isHorizon = true) { return CheckBoxList(helper, name, name, selectList, htmlAttributes, isHorizon); } public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string id, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isHorizon = true) { IDictionary<string, object> HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); HashSet<string> set = new HashSet<string>(); List<SelectListItem> list = new List<SelectListItem>(); string selectedValues = (selectList as SelectList).SelectedValue == null ? string.Empty : 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].Trim()); } } 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", id); HtmlAttributes.Add("name", name); HtmlAttributes.Add("style", "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); string containerFormat = isHorizon ? @"<label> {0} {1}</label>" : @"<p><label> {0} {1}</label></p>"; stringBuilder.AppendFormat(containerFormat, 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; } } }
RadioBoxListHelper代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Mvc; namespace SHH.Helpers { public static class RadioBoxListHelper { public static MvcHtmlString RadioBoxList(this HtmlHelper helper, string name) { return RadioBoxList(helper, name, helper.ViewData[name] as IEnumerable<SelectListItem>, new { }); } public static MvcHtmlString RadioBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList) { return RadioBoxList(helper, name, selectList, new { }); } public static MvcHtmlString RadioBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes) { IDictionary<string, object> HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); HtmlAttributes.Add("type", "radio"); HtmlAttributes.Add("name", name); StringBuilder stringBuilder = new StringBuilder(); int i = 0; int j = 0; foreach (SelectListItem selectItem in selectList) { string id = string.Format("{0}{1}", name, j++); IDictionary<string, object> newHtmlAttributes = HtmlAttributes.DeepCopy(); newHtmlAttributes.Add("value", selectItem.Value); newHtmlAttributes.Add("id", id); var selectedValue = (selectList as SelectList).SelectedValue; if (selectedValue == null) { if (i++ == 0) newHtmlAttributes.Add("checked", null); } else if (selectItem.Value == selectedValue.ToString()) { newHtmlAttributes.Add("checked", null); } TagBuilder tagBuilder = new TagBuilder("input"); tagBuilder.MergeAttributes<string, object>(newHtmlAttributes); string inputAllHtml = tagBuilder.ToString(TagRenderMode.SelfClosing); stringBuilder.AppendFormat(@" {0} <label for='{2}'>{1}</label>", inputAllHtml, selectItem.Text, id); } 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; } } }
枚举帮助类代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace SHH.Helpers { /// <summary> /// 枚举帮助类 /// </summary> public class EnumHelper { /// <summary> /// 转换如:"enum1,enum2,enum3"字符串到枚举值 /// </summary> /// <typeparam name="T">枚举类型</typeparam> /// <param name="obj">枚举字符串</param> /// <returns></returns> public static T Parse<T>(string obj) { if (string.IsNullOrEmpty(obj)) return default(T); else return (T)Enum.Parse(typeof(T), obj); } public static T TryParse<T>(string obj, T defT = default(T)) { try { return Parse<T>(obj); } catch { return defT; } } public static readonly string ENUM_TITLE_SEPARATOR = ","; /// <summary> /// 根据枚举值,返回描述字符串 /// 如果多选枚举,返回以","分割的字符串 /// </summary> /// <param name="e"></param> /// <returns></returns> public static string GetEnumTitle(Enum e, Enum language = null) { if (e == null) { return ""; } string[] valueArray = e.ToString().Split(ENUM_TITLE_SEPARATOR.ToArray(), StringSplitOptions.RemoveEmptyEntries); Type type = e.GetType(); string ret = ""; foreach (string enumValue in valueArray) { System.Reflection.FieldInfo fi = type.GetField(enumValue.Trim()); if (fi == null) continue; EnumTitleAttribute[] attrs = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[]; if (attrs != null && attrs.Length > 0 && attrs[0].IsDisplay) { ret += attrs[0].Title + ENUM_TITLE_SEPARATOR; } } return ret.TrimEnd(ENUM_TITLE_SEPARATOR.ToArray()); } /// <summary> /// 根据枚举值,返回描述字符串 /// 如果多选枚举,返回以","分割的字符串 /// </summary> /// <param name="e"></param> /// <returns></returns> public static string GetAllEnumTitle(Enum e, Enum language = null) { if (e == null) { return ""; } string[] valueArray = e.ToString().Split(ENUM_TITLE_SEPARATOR.ToArray(), StringSplitOptions.RemoveEmptyEntries); Type type = e.GetType(); string ret = ""; foreach (string enumValue in valueArray) { System.Reflection.FieldInfo fi = type.GetField(enumValue.Trim()); if (fi == null) continue; EnumTitleAttribute[] attrs = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[]; if (attrs != null && attrs.Length > 0) { ret += attrs[0].Title + ENUM_TITLE_SEPARATOR; } } return ret.TrimEnd(ENUM_TITLE_SEPARATOR.ToArray()); } public static EnumTitleAttribute GetEnumTitleAttribute(Enum e, Enum language = null) { if (e == null) { return null; } string[] valueArray = e.ToString().Split(ENUM_TITLE_SEPARATOR.ToArray(), StringSplitOptions.RemoveEmptyEntries); Type type = e.GetType(); EnumTitleAttribute ret = null; foreach (string enumValue in valueArray) { System.Reflection.FieldInfo fi = type.GetField(enumValue.Trim()); if (fi == null) continue; EnumTitleAttribute[] attrs = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[]; if (attrs != null && attrs.Length > 0) { ret = attrs[0]; break; } } return ret; } public static string GetDayOfWeekTitle(DayOfWeek day, Enum language = null) { switch (day) { case DayOfWeek.Monday: return "周一"; case DayOfWeek.Tuesday: return "周二"; case DayOfWeek.Wednesday: return "周三"; case DayOfWeek.Thursday: return "周四"; case DayOfWeek.Friday: return "周五"; case DayOfWeek.Saturday: return "周六"; case DayOfWeek.Sunday: return "周日"; default: return ""; } } /// <summary> /// 返回键值对,建为枚举的EnumTitle中指定的名称和近义词名称,值为枚举项 /// </summary> /// <typeparam name="T">枚举类型</typeparam> /// <param name="language"></param> /// <returns></returns> public static Dictionary<string, T> GetTitleAndSynonyms<T>(Enum language = null) where T : struct { Dictionary<string, T> ret = new Dictionary<string, T>(); //枚举值 Array arrEnumValue = typeof(T).GetEnumValues(); foreach (object enumValue in arrEnumValue) { System.Reflection.FieldInfo fi = typeof(T).GetField(enumValue.ToString()); if (fi == null) { continue; } EnumTitleAttribute[] arrEnumTitleAttr = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[]; if (arrEnumTitleAttr == null || arrEnumTitleAttr.Length < 1 || !arrEnumTitleAttr[0].IsDisplay) { continue; } if (!ret.ContainsKey(arrEnumTitleAttr[0].Title)) { ret.Add(arrEnumTitleAttr[0].Title, (T)enumValue); } if (arrEnumTitleAttr[0].Synonyms == null || arrEnumTitleAttr[0].Synonyms.Length < 1) { continue; } foreach (string s in arrEnumTitleAttr[0].Synonyms) { if (!ret.ContainsKey(s)) { ret.Add(s, (T)enumValue); } } }//using return ret; } /// <summary> /// 根据枚举获取包含所有所有值和描述的哈希表,其文本是由应用在枚举值上的EnumTitleAttribute设定 /// </summary> /// <returns></returns> public static Dictionary<T, string> GetItemList<T>(Enum language = null) where T : struct { return GetItemValueList<T, T>(false, language); } /// <summary> /// 根据枚举获取包含所有所有值和描述的哈希表,其文本是由应用在枚举值上的EnumTitleAttribute设定 /// </summary> /// <returns></returns> public static Dictionary<T, string> GetAllItemList<T>(Enum language = null) where T : struct { return GetItemValueList<T, T>(true, language); } /// <summary> /// 获取枚举所有项的标题,其文本是由应用在枚举值上的EnumTitleAttribute设定 /// </summary> /// <typeparam name="T">枚举类型</typeparam> /// <param name="language">语言</param> /// <returns></returns> public static Dictionary<int, string> GetItemValueList<T>(Enum language = null) where T : struct { return GetItemValueList<T, int>(false, language); } /// <summary> /// 获取枚举所有项的标题,其文本是由应用在枚举值上的EnumTitleAttribute设定 /// </summary> /// <typeparam name="T">枚举类型</typeparam> /// <param name="isAll">是否生成“全部”项</param> /// <param name="language">语言</param> /// <returns></returns> public static Dictionary<TKey, string> GetItemValueList<T, TKey>(bool isAll, Enum language = null) where T : struct { if (!typeof(T).IsEnum) { throw new Exception("参数必须是枚举!"); } Dictionary<TKey, string> ret = new Dictionary<TKey, string>(); var titles = EnumHelper.GetItemAttributeList<T>().OrderBy(t => t.Value.Order); foreach (var t in titles) { if (!isAll && (!t.Value.IsDisplay || t.Key.ToString() == "None")) continue; if (t.Key.ToString() == "None" && isAll) { ret.Add((TKey)(object)t.Key, "全部"); } else { if (!string.IsNullOrEmpty(t.Value.Title)) ret.Add((TKey)(object)t.Key, t.Value.Title); } } return ret; } public static List<T> GetItemKeyList<T>(Enum language = null) where T : struct { List<T> list = new List<T>(); Array array = typeof(T).GetEnumValues(); foreach (object t in array) { list.Add((T)t); } return list; } public static Dictionary<T, EnumTitleAttribute> GetItemAttributeList<T>(Enum language = null) where T : struct { if (!typeof(T).IsEnum) { throw new Exception("参数必须是枚举!"); } Dictionary<T, EnumTitleAttribute> ret = new Dictionary<T, EnumTitleAttribute>(); Array array = typeof(T).GetEnumValues(); foreach (object t in array) { EnumTitleAttribute att = GetEnumTitleAttribute(t as Enum, language); if (att != null) ret.Add((T)t, att); } return ret; } /// <summary> /// 获取枚举所有项的标题,其文本是由应用在枚举值上的EnumTitleAttribute设定 /// </summary> /// <typeparam name="T">枚举类型</typeparam> /// <param name="isAll">是否生成“全部”项</param> /// <param name="language">语言</param> /// <returns></returns> public static Dictionary<TKey, string> GetAllItemValueList<T, TKey>(Enum language = null) where T : struct { return GetItemValueList<T, TKey>(true, language); } /// <summary> /// 获取一个枚举的键值对形式 /// </summary> /// <typeparam name="TEnum">枚举类型</typeparam> /// <param name="exceptTypes">排除的枚举</param> /// <returns></returns> public static Dictionary<int, string> GetEnumDictionary<TEnum>(IEnumerable<TEnum> exceptTypes = null) where TEnum : struct { var dic = GetItemList<TEnum>(); Dictionary<int, string> dicNew = new Dictionary<int, string>(); foreach (var d in dic) { if (exceptTypes != null && exceptTypes.Contains(d.Key)) { continue; } dicNew.Add(d.Key.GetHashCode(), d.Value); } return dicNew; } } public class EnumTitleAttribute : Attribute { private bool _IsDisplay = true; public EnumTitleAttribute(string title, params string[] synonyms) { Title = title; Synonyms = synonyms; Order = int.MaxValue; } public bool IsDisplay { get { return _IsDisplay; } set { _IsDisplay = value; } } public string Title { get; set; } public string Description { get; set; } public string Letter { get; set; } /// <summary> /// 近义词 /// </summary> public string[] Synonyms { get; set; } public int Category { get; set; } public int Order { get; set; } } }
枚举数据代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace SHH.Helpers { public class EnumData { /// <summary> /// 性别 /// </summary> public enum EnumSex { [EnumTitle("先生")] Sir = 1, [EnumTitle("女士")] Miss = 2 } /// <summary> /// 预约时间 /// </summary> public enum EnumBespeakDate { [EnumTitle("工作日(周一到周五)")] BespeakDate1 = 1, [EnumTitle("双休日")] BespeakDate2 = 2, [EnumTitle("工作日或双休日")] BespeakDate3 = 3 } /// <summary> /// 预约时段 /// </summary> public enum EnumBespeakTime { [EnumTitle("上午")] BespeakTime1 = 1, [EnumTitle("下午")] BespeakTime2 = 2, [EnumTitle("晚上")] BespeakDate3 = 3, [EnumTitle("随时")] BespeakDate4= 4 } /// <summary> /// 售价 /// </summary> public enum EnumPriceGroup { [EnumTitle("不限", IsDisplay = false)] None = 0, [EnumTitle("30万以下")] Below30 = 1, [EnumTitle("30-50万")] From30To50 = 2, [EnumTitle("50-80万")] From50To80 = 3, [EnumTitle("80-100万")] From80To100 = 4, [EnumTitle("100-150万")] From100To50 = 5, [EnumTitle("150-200万")] From150To200 = 6, [EnumTitle("200万以上")] Above200 = 7 } /// <summary> /// 面积 /// </summary> public enum EnumAcreageGroup { [EnumTitle("不限", IsDisplay = false)] None = 0, [EnumTitle("50mm以下")] Below50 = 1, [EnumTitle("50-70mm")] From50To70 = 2, [EnumTitle("70-90mm")] From70To90 = 3, [EnumTitle("90-120mm")] From90To120 = 4, [EnumTitle("120-150mm")] From120To150 = 5, [EnumTitle("150-200mm")] From150To200 = 6, [EnumTitle("200-300mm")] From200To300 = 7, [EnumTitle("300mm以上")] Above300 = 8 } /// <summary> /// 房型 二室 三室 四室 五室 五室以上 /// </summary> public enum EnumRoomGroup { [EnumTitle("不限", IsDisplay = false)] None = 0, [EnumTitle("一室")] Room1 = 1, [EnumTitle("二室")] Room2 = 2, [EnumTitle("三室")] Room3 = 3, [EnumTitle("四室")] Room4 = 4, [EnumTitle("五室")] Room5 = 5, [EnumTitle("五室以上")] Above5 = 6 } } }
Controller代码[RadioBox]
ViewData.Add("EnumPriceGroup", new SelectList(EnumHelper.GetItemValueList<EnumData.EnumPriceGroup>(), "Key", "Value")); ViewData.Add("EnumAcreageGroup", new SelectList(EnumHelper.GetItemValueList<EnumData.EnumAcreageGroup>(), "Key", "Value")); ViewData.Add("EnumRoomGroup", new SelectList(EnumHelper.GetItemValueList<EnumData.EnumRoomGroup>(), "Key", "Value"));
View代码[RadioBox]
@Html.RadioBoxList("EnumPriceGroup") @Html.RadioBoxList("EnumAcreageGroup") @Html.RadioBoxList("EnumRoomGroup")
Controller代码[CheckBox]
TagRepository tagrep = new TagRepository();
var tag = tagrep.GetModelList().Where(d=>d.TypeID==1); ViewBag.Tags = new SelectList(tag, "TagID", "TagName"); var tag1 = tagrep.GetModelList().Where(d => d.TypeID == 2); ViewBag.Tags1 = new SelectList(tag1, "TagID", "TagName"); var tag2 = tagrep.GetModelList().Where(d => d.TypeID == 3); ViewBag.Tags2 = new SelectList(tag2, "TagID", "TagName");
/// <summary> /// 添加 GET: /admin/House/Add /// </summary> /// <param name="model">实体类</param> /// <param name="fc"></param> /// <returns></returns> [Authorize, HttpPost, ValidateInput(false)] public ActionResult Add(House model, FormCollection fc,int[] Tags, int[] Tags1,int[] Tags2) { model.State = 1; model.CreateTime = DateTime.Now; HouseControllerrep.SaveOrEditModel(model); if (Tags.Length > 0) { foreach (int gsi in Tags){ TagHouseMapping thmtag = new TagHouseMapping(); thmtag.TagID=gsi; thmtag.HouseID = model.HouseID; thmtag.State = 1; thmtag.CreateTime = DateTime.Now; TagCrep.SaveOrEditModel(thmtag); } } if (Tags1.Length > 0) { foreach (int gsi in Tags1) { TagHouseMapping thmtag = new TagHouseMapping(); thmtag.TagID = gsi; thmtag.HouseID = model.HouseID; thmtag.State = 1; thmtag.CreateTime = DateTime.Now; TagCrep.SaveOrEditModel(thmtag); } } if (Tags2.Length > 0) { foreach (int gsi in Tags2) { TagHouseMapping thmtag = new TagHouseMapping(); thmtag.TagID = gsi; thmtag.HouseID = model.HouseID; thmtag.State = 1; thmtag.CreateTime = DateTime.Now; TagCrep.SaveOrEditModel(thmtag); } } return RedirectToAction("Index"); } #endregion
View代码[CheckBox]
@Html.CheckBoxList("Tags") @Html.CheckBoxList("Tags1") @Html.CheckBoxList("Tags2")
CheckBoxList效果
RadioBoxList效果
声明:本博客高度重视知识产权保护,发现本博客发布的信息包含有侵犯其著作权的链接内容时,请联系我,我将第一时间做相应处理,联系邮箱ffgign@qq.com。
作者:Mark Fan (小念头) 来源:http://cube.cnblogs.com
说明:未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有疑问,可以通过 ffgign@qq.com 联系作者,本文章采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可