主攻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效果

主攻ASP.NET MVC4.0之重生:CheckBoxListHelper和RadioBoxListHelper的使用

RadioBoxList效果

声明:本博客高度重视知识产权保护,发现本博客发布的信息包含有侵犯其著作权的链接内容时,请联系我,我将第一时间做相应处理,联系邮箱[email protected]

 


作者:Mark Fan (小念头)    
来源:http://cube.cnblogs.com
说明:未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有疑问,可以通过 [email protected] 联系作者,本文章采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可

 

你可能感兴趣的:(checkbox)