MVC3,EF,根据枚举生成下拉框,获取枚举的自定义属性值.自动扩展,快速开发。
2012-08-05 14:26
369 查看
项目中经常用到枚举,根据枚举定义的下拉框比如用户状态等,就非常麻烦,所以写个根据枚举项自动生成下拉框,并扩展htmlhelper类去显示枚举的值.
定义管理员状态枚举值:
更具枚举生成下拉框:
简单helpers 方法:
全局静态扩展:
扩展htmlhelper进行显示
使用方式
下拉框:
@Helpers.DropEnumFor(typeof(ManageState), "state", new KeyValuePair<string, string>("全部", "0"))
显示:
<span>
[@Html.Display(item.ManageState)]
</span>
注:如果在反射时候加上缓存,效率会提升。
定义管理员状态枚举值:
/// <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>
注:如果在反射时候加上缓存,效率会提升。
相关文章推荐
- Jdbc的扩展--获取自动生成的主键id
- 根据mysql数据库自动生成mvc三层代码及jsp页,极速开发srpingmvc+mybatis+bootstrap项目。
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架- 5.4平台日志、异常管理、生成自动升级配置文件模块
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架- 5.4平台日志、异常管理、生成自动升级配置文件模块
- android mvp快速开发框架介绍(自动生成android代码工具介绍)
- Myeclipse8.6 快速搭建ssh(JPA)开发环境 并自动生成dao ,model
- excel报表开发-- 根据datatable个数自动生成新sheet
- asp.net2.0自动根据用户自定义字数生成带分页的静态(HTML)页
- 使用T4模板为EF框架添加实体根据数据库自动生成字段注释的功能
- ASP.NET基础教程-Web 自定义控件的使用-根据属性值从数据库中提取数据并在页面上自动生成一个表格
- 自动生成导出前端页面的快速开发工具,让代码开发变得简单
- [置顶] AS插件开发:根据特定格式的文本自动生成Java Bean文件或字段
- Spinner获取SQLite数据库数据生成自定义下拉框(下拉选择收货地址)
- 获取DataGridView绑定BindingSource的数据表,并根据树控件点击进行筛选数据表,下拉控件自定义排序问题初步解决方法,解决了该行属于另一个表的错误提示.
- 使用pl/sql快速获取表自增主键以外的所有列,用于重新自动生成一次数据主键
- [C#]一步一步开发自己的自动代码生成工具之一:获取SQL2005的数据库表结构
- [翻译][php扩展开发和嵌入式]第18章-php的扩展自动生成
- asp.net2.0自动根据用户自定义字数生成带分页的静态(HTML)页 v1.5 beta
- js获取html下拉框中选中值的自定义属性值
- MVC网站开发:自定义扩展方法ModelStateExtension获取ModelState中的错误信息