您的位置:首页 > 其它

MVC3,EF,根据枚举生成下拉框,获取枚举的自定义属性值.自动扩展,快速开发。

2012-08-05 14:26 369 查看
项目中经常用到枚举,根据枚举定义的下拉框比如用户状态等,就非常麻烦,所以写个根据枚举项自动生成下拉框,并扩展htmlhelper类去显示枚举的值.

定义管理员状态枚举值:

/// <summary>
/// 管理员状态
/// </summary>
public enum ManageState
{
/// <summary>
/// 正常
/// </summary>
[Display(Name="正常")]
Normal = 0,
/// <summary>
/// 已禁用
/// </summary>
[Display(Name = "已禁用")]
Stop = 1
}


更具枚举生成下拉框:

简单helpers 方法:

@*将枚举变为下拉框*@
@helper DropEnumFor(Type enumType,string name="state",KeyValuePair<string,string>? defu=null){
Dictionary<string, int> dir = new Dictionary<string, int>();
var discriptType = typeof(System.ComponentModel.DataAnnotations.DisplayAttribute);
var defultChecked = HttpContext.Current.Request["state"];
foreach (var filed in enumType.GetFields())
{
if (!filed.FieldType.IsEnum) {continue;}
var val = (int)enumType.InvokeMember(filed.Name, System.Reflection.BindingFlags.GetField, null, null, null);
var key = "";
var attrs=filed.GetCustomAttributes(discriptType,true);
if (attrs.Length > 0)
{
key = ((DisplayAttribute)attrs[0]).Name;
}
else
{
key = filed.Name;
}
dir.Add(key, val);
}
<select id="@name" name="@name">
@if (defu != null)
{
<option value="@defu.Value.Value">@defu.Value.Key</option>
}
@foreach (var item in dir.OrderByDescending(p=>p.Value))
{
var check = string.Empty;
if (defultChecked == item.Value.ToString())
{ check = "selected=\"true\""; }
<option value="@item.Value" @check >@item.Key</option>
}
</select>
}


全局静态扩展:

/// <summary>
/// 获取枚举的下拉框
/// </summary>
/// <typeparam name="TEnum">枚举类型</typeparam>
/// <param name="name">空间name属性</param>
/// <param name="defaultValue">默认值</param>
/// <returns>select 下拉框</returns>
public static string DropEnumFor<TEnum>(this HtmlHelper helper, string name = "state", KeyValuePair<string, string>? defaultValue = null)
where TEnum : struct
{
var result = new StringBuilder("<select");
var enumType = typeof(TEnum);
var defultChecked = HttpContext.Current.Request["state"];
Dictionary<string, int> dir = new Dictionary<string, int>();
var discriptType = typeof(System.ComponentModel.DataAnnotations.DisplayAttribute);
foreach (var filed in enumType.GetFields())
{
if (!filed.FieldType.IsEnum) { continue; }
var val = (int)enumType.InvokeMember(filed.Name, System.Reflection.BindingFlags.GetField, null, null, null);
var key = "";
var attrs = filed.GetCustomAttributes(discriptType, true);
if (attrs.Length > 0)
{
key = ((DisplayAttribute)attrs[0]).Name;
}
else
{
key = filed.Name;
}
dir.Add(key, val);
}
result.AppendFormat(" id=\"{0}\" name=\"{1}\">", name, name);
if (defaultValue != null)
{

}
foreach (var item in dir.OrderByDescending(p => p.Value))
{
var check=string.Empty;;
if (defultChecked == item.Value.ToString())
check = "selected=\"true\"";
result.AppendFormat("<option value=\"{0}\" {2}>{1}</option>", item.Value, item.Key, check);
}
result.Append("</select>");
return result.ToString();
}
}


扩展htmlhelper进行显示

/// <summary>
/// 获取枚举的display属性
/// </summary>
/// <param name="helper"></param>
/// <param name="state"></param>
/// <returns></returns>
public static string Display<TEnum>(this HtmlHelper helper, TEnum state) where TEnum : struct
{
var enumType = typeof(TEnum);
var discriptType = typeof(System.ComponentModel.DataAnnotations.DisplayAttribute);
var enumName = enumType.GetEnumName(state);
var result = enumName;
var attributes= enumType.GetField(enumName).GetCustomAttributes(discriptType, true);
if (attributes.Length <= 0) return result;
var dispay=attributes[0] as System.ComponentModel.DataAnnotations.DisplayAttribute;
result = dispay == null ? result : dispay.Name;
return result;
}


使用方式
下拉框:

@Helpers.DropEnumFor(typeof(ManageState), "state", new KeyValuePair<string, string>("全部", "0"))

显示:

<span>
[@Html.Display(item.ManageState)]
</span>

注:如果在反射时候加上缓存,效率会提升。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐