Asp.Net 之 枚举类型的下拉列表绑定
有这样一个学科枚举类型:
/// 学科 /// </summary> public enum Subject { None = 0, [Description("语文")] Chinese = 1, [Description("数学")] Mathematics = 2, [Description("英语")] English = 3, [Description("政治")] Politics = 4, [Description("物理")] Physics = 5, [Description("化学")] Chemistry = 6, [Description("历史")] History = 7, [Description("地理")] Geography = 8, [Description("生物")] Biology = 9 }
这里使用了一个Description特性,目的是为了在一个DropDownList列表中绑定文本数据。
这里使用了一个扩展方法,目的为了返回一个Value和Text的数据列表,上方法:
/// 枚举辅助类 /// </summary> public static class EnumHelper { /// <summary> /// 获得枚举类型数据项(不包括空项) /// </summary> /// <param name="enumType">枚举类型</param> /// <returns></returns> public static IList<object> GetItems(this Type enumType) { if (!enumType.IsEnum) throw new InvalidOperationException(); IList<object> list = new List<object>(); // 获取Description特性 Type typeDescription = typeof(DescriptionAttribute); // 获取枚举字段 FieldInfo[] fields = enumType.GetFields(); foreach (FieldInfo field in fields) { if (!field.FieldType.IsEnum) continue; // 获取枚举值 int value = (int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null); // 不包括空项 if (value > 0) { string text = string.Empty; object[] array = field.GetCustomAttributes(typeDescription, false); if (array.Length > 0) text = ((DescriptionAttribute)array[0]).Description; else text = field.Name; //没有描述,直接取值 //添加到列表 list.Add(new { Value = value, Text = text }); } } return list; } }
这里采用特性反射的方式得到了对应的Value和Text,最后返回了一个new { Value = …, Text = … }的匿名类的列表。
那么页面上实现就相当简单了:
ddlSubject.DataSource = typeof(Subject).GetItems(); ddlSubject.DataTextField = "Text"; ddlSubject.DataValueField = "Value"; ddlSubject.DataBind();