反射+枚举实现Select下拉菜单

来源:互联网 发布:c语言中字符串数组 编辑:程序博客网 时间:2024/05/01 12:55

1.首先创建一个Display特性,代码如下:

/// <summary>    /// 定义Display特性    /// </summary>    public class DisplayAttribute:System.Attribute    {        public DisplayAttribute() { }        /// <summary>        /// 展示名称        /// </summary>        public string Name { get; set; }    }

2.定义一个枚举类型
public enum EnterpriseType : int    {        [Display(Name = "国有经济")]        stateOwned = 1,        [Display(Name = "集体经济")]        collective = 2,        [Display(Name = "私营经济")]        privateOwned = 3,        [Display(Name = "个体经济")]        individual = 4    }

3.根据反射创建枚举的扩展方法,展示出Display的名称
public static class DisplayEnumExtension    {        /// <summary>        /// 反射获取枚举项的名称(对枚举的扩展)        /// </summary>        /// <param name="enumVal">枚举值</param>        /// <returns></returns>        public static string GetDisplayName(this Enum enumVal)         {            //Display显示名称            string showName = "";            //获取枚举值的Type            var type = enumVal.GetType();            //枚举值的字符串表示            string enumStr = enumVal.ToString();            //根据字符串获取对应的枚举成员            var memberInfo= type.GetMember(enumStr);            if (memberInfo == null || memberInfo.Count() == 0)            {                //如果成员不存在,则显示英文字符串                showName = enumStr;            }            else            {                //获取成员的DisplayAttribute的特性,如果为空则显示英文字符串                var attrbutes=memberInfo[0].GetCustomAttributes(typeof(DisplayAttribute),false);                DisplayAttribute attribute = (attrbutes.Length > 0) ? (DisplayAttribute)attrbutes[0] : null;                showName = attribute == null ? enumStr : attribute.Name;            }            return showName;        }    }

4.创建形成select下拉菜单html的类和方法
public class SelectHelper    {        /// <summary>        /// 创建select字符串        /// </summary>        /// <typeparam name="TEnum">select枚举</typeparam>        /// <param name="controlId">select的Id</param>        /// <param name="controlName">select的Name</param>        /// <param name="selectItem">选中项值</param>        /// <returns></returns>        public static HtmlString CreateEnumSelect<TEnum>(string controlId,string controlName,int selectItem=0)        {            StringBuilder selectHtml = new StringBuilder();            selectHtml.Append("<select id="+controlId+" name="+controlName+">");            //从枚举中反射获取成员            var values = from TEnum e in Enum.GetValues(typeof(TEnum))                         select new {Value=e,Text=(e as Enum).GetDisplayName() };            foreach (var item in values)            {                //选中项                if (selectItem > 0 && selectItem == Convert.ToInt32(item.Value))                {                    selectHtml.Append("<option selected=selected value=" + Convert.ToInt32(item.Value) + ">" + item.Text + "</option>");                }                else                {                    selectHtml.Append("<option value=" + Convert.ToInt32(item.Value) + ">" + item.Text + "</option>");                }                            }            selectHtml.Append("</select>");            var htmStr = new HtmlString(selectHtml.ToString());            return htmStr;        }    }

5.应用实现
<div id="noSelectHtml"></div><div id="selectHtml"></div><script src="~/Content/js/jquery-1.9.1.js"></script><script type="text/javascript">    $(function () {        //不选中任何项        $("#noSelectHtml").html('@(HTYDTest.UtilClass.SelectHelper.CreateEnumSelect<HTYDTest.UtilClass.EnterpriseType>("enterpriseType", "enterpriseType"))');        //选中私营经济项        $("#selectHtml").html('@(HTYDTest.UtilClass.SelectHelper.CreateEnumSelect<HTYDTest.UtilClass.EnterpriseType>("enterpriseType", "enterpriseType",Convert.ToInt32(HTYDTest.UtilClass.EnterpriseType.privateOwned)))');    })</script>

6.效果展示


0 0