我正在做一个出入库管理的简单项目,在Models里定义了这样的枚举类型
public enum InOrOut { [Description("出库")] Out = 0, [Description("入库")] In = 1 }
我想在输入参数为数据库字段值1或者0的时候,在页面上显示为枚举Name:In、Out,或者干脆显示为Description:出库、入库。
获取枚举Name其实很简单:
return Enum.GetName(typeof(InOrOut), value).ToString());
为了能在视图里通过调用@Html.DisplayInOrOut(item.InOrOut)的方式显示该枚举类型的Name,我扩展了HtmlHelper,在Controllers中增加一个HtmlExtensions.cs,在里面新增了一个EnumExtensions类,注意命名空间为System.Web.Mvc,这样才能在视图里以@Html.的方式调用:
namespace System.Web.Mvc { public static class EnumExtensions { //显示Enum类型的Name值 public static MvcHtmlString DisplayInOrOut(this HtmlHelper htmlHelper, int value) return MvcHtmlString.Create(Enum.GetName(typeof(StockInOrOut), value).ToString()); } ... }
@Html.DisplayInOrOut(1)在视图里显示出来就是"In",可如果我们要显示的是中文的Description呢?
一般来说,如果不用[Descript]标签的话,我们需要编写一个翻译器,
public string DisplayInOrOutDescription(int value) { InOrOut obj=(InOrOut)value; string result = string.Empty; switch (obj) { case InOrOut.In: result = "入库"; break; case InOrOut.Out: result = "出库"; break; default: result = ""; break; } return result; }
既然C#语言为我们描述数据接口的时候DescriptionAttribute标签,为什么不好好利用呢?
增加这个命名空间:
1 | using System.ComponentModel; |
将方法改造成:
//显示Enum类型的Description值(如果有)或者Name值 public static MvcHtmlString DisplayInOrOut(this HtmlHelper htmlHelper, int value) { if (!Enum.IsDefined(typeof(InOrOut), value)) { return MvcHtmlString.Empty; } StockInOrOut obj = (InOrOut)value; DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])(obj.GetType().GetField(obj.ToString())).GetCustomAttributes(typeof(DescriptionAttribute), false); if (EnumAttributes.Length > 0) { return MvcHtmlString.Create(EnumAttributes[0].Description); } return MvcHtmlString.Create(obj.ToString()); }
这样在视图里出来的效果就是枚举类型里头定义的Description了:"出库""入库",还不影响数据库里的整型字段,又不影响程序里头的io=InOrOut.In这样的表述,多爽!
可是如果我的项目里头定义了多个枚举类型,比如还有一个操作状态:
1 2 3 4 5 6 7 8 9 | public enum LogStatus { [Description( "操作未确定" )] UnConfirmed = -1, [Description( "操作取消" )] Cancel = 0, [Description( "操作已确定" )] Confirmed = 1 } |
那么也想把数据库中取得的字段值显示为该枚举的Description或者Name,势必又要定义一个大部分代码重复的DisplayLogStatus()的方法,能不能直接把枚举类型的名称作为变量带进方法呢?在方法里头再根据传入的名称还原出该枚举类型来。
我试了可以用该方法根据枚举类型的名称获得枚举类型:
1 | Type enumType = Type.GetType( "MvcApplicationName.Models.InOrOut" ); |
必须要加上你的MvcApplicationName的命名空间,否则返回值为null,现在返回值是这样:
enumType {Name = "StockInOrOut" FullName = "MvcApplicationName.Models.StockInOrOut"}
当然还有一堆属性:
Assembly {MvcApplicationName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null} 等等
我们利用这个反射回来的类型就能得到对应名称的枚举Name值了:
//显示Enum类型的Name字段 public static MvcHtmlString DisplayEnumName(this HtmlHelper htmlHelper, string enumTypeName, int value) { Type enumType = Type.GetType("StockManager.Models." + enumTypeName); if (!Enum.IsDefined(enumType, value)) { return MvcHtmlString.Empty; } //如果只是要简单的返回枚举的Name值就只要这一行了 return MvcHtmlString.Create(Enum.GetName(enumType, value)); }
于是我在视图里这么用还挺爽的:
1 2 | @Html.DisplayEnumName( "LogStatus" , item.Status) @Html.DisplayEnumName( "InOrOut" , item.InOrOut) |
如果我想把DisplayEnumName改造成能够显示Description呢?
再增加这个方法:
//显示Enum类型的Description字段或者Name字段 public static MvcHtmlString DisplayEnumDescription(this HtmlHelper htmlHelper, string enumTypeName, int value) { Type enumType = Type.GetType("StockManager.Models." + enumTypeName); if (!Enum.IsDefined(enumType, value)) { return MvcHtmlString.Empty; } DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])(enumType.GetField(Enum.GetName(enumType, value))).GetCustomAttributes(typeof(DescriptionAttribute), false); if (EnumAttributes.Length > 0) { return MvcHtmlString.Create(EnumAttributes[0].Description); } //如果只是要简单的返回枚举的Name值就只要这一行了 return MvcHtmlString.Create(Enum.GetName(enumType, value)); }
视图里的调用改成就行了:
@Html.DisplayEnumDescription("LogStatus", item.Status) @Html.DisplayEnumDescription("InOrOut", item.InOrOut)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义