前言:
在录入信息的时候,我们经常会使用枚举来表示一个类型.例如性别,状态等.这样使用非常方便,但是会遇到几个问题,例如性别:
1.数据库 ---------------------------------枚举类型的数字值
2.代码为了可读性----------------------枚举类中定义的是英文变量
public enum GenderEnum
{
/// <summary>
/// 男
/// </summary>
Male = 0,
/// <summary>
/// 女
/// </summary>
Female = 1,
/// <summary>
/// 其他
/// </summary>
Other = 2
}
3.前台页面为了用户交互-------------下拉列表显示的汉字
实现思路
1.写一个自定义注解,将枚举类中的枚举值注解上前台页面我们需要显示的内容
2.写一个方法,将需要处理的枚举类通过反射,将自定义的注解属性 和 枚举的值给配对装载在List<SelectListItem>中
实现步骤:
1.写一个工具类EnumHelper,里面有封装好自定义注解和反射方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;
namespace Common
{
/// <summary>
/// 自定义注解属性
/// </summary>
public class SelectDisplayNameAttribute : Attribute
{
private string _diaplayName;
public string DisplayName
{
get
{
return _diaplayName;
}
}
public SelectDisplayNameAttribute(string displayName)
{
_diaplayName = displayName;
}
}
public class EnumHelper
{
/// <summary>
/// 获取自定义属性获取的内容
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static string GetEnumDescription(Object obj)
{
//获取枚举对象的枚举类型
Type type = obj.GetType();
//通过反射获取该枚举类型的所有属性
FieldInfo[] fieldInfos = type.GetFields();
foreach (FieldInfo field in fieldInfos)
{
//不是参数obj,就直接跳过
if (field.Name != obj.ToString())
{
continue;
}
//取出参数obj的自定义属性
if (field.IsDefined(typeof(SelectDisplayNameAttribute), true))
{
return (field.GetCustomAttributes(typeof(SelectDisplayNameAttribute), true)[0] as SelectDisplayNameAttribute).DisplayName;
}
}
return obj.ToString();
}
/// <summary>
/// 将枚举类型的值和自定义属性配对组合为 List<SelectListItem>
/// </summary>
/// <param name="enumType"></param>
/// <returns></returns>
public static List<SelectListItem> GetSelectList<T>()
{
var enumType = typeof(T);
List<SelectListItem> selectList = new List<SelectListItem>();
foreach (var obj in Enum.GetValues(enumType))
{
// 注意一定要Value = obj.ToString()
//原因是Value = (int)(obj.ToString()),这样取的枚举是对应的int值,在@Html.DropDownListFor中是无法显示默认选中值的,问题原因未解
selectList.Add(new SelectListItem { Text = GetEnumDescription(obj), Value = obj.ToString() });
}
return selectList;
}
}
}
2.枚举类上添加自定义属性
public enum GenderEnum
{
/// <summary>
/// 男
/// </summary>
[SelectDisplayName("男")]
Male = 0,
/// <summary>
/// 女
/// </summary>
[SelectDisplayName("女")]
Female = 1,
/// <summary>
/// 其他
/// </summary>
[SelectDisplayName("其他")]
Other = 2
}
3.通过我们封装的方法,将性别的枚举类型转换为List<SelectListItem>,通过ViewBag或者ViewData传递给前台页面
public ActionResult Add()
{
ViewBag.GenderList = EnumHelper.GetSelectList<GenderEnum>();
return View();
}
4.在前台页面上通过@Html.DropDownListFor() 或者@Html.DropDownList()使用
@Html.DropDownListFor(m => m.Gender, (IEnumerable<SelectListItem>)ViewBag.GenderList)
说明
每一次解决问题都要感谢一下那些分享知识,技术和经验的万能的网友们~
参考博客:http://www.cnblogs.com/darrenji/archive/2015/04/10/4413801.html