我正在做一个出入库管理的简单项目,在Models里定义了这样的枚举类型

    public enum InOrOut
{
[Description("出库")]
Out = ,
[Description("入库")]
In =
}

我想在输入参数为数据库字段值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标签,为什么不好好利用呢?

增加这个命名空间:

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 > )
{
return MvcHtmlString.Create(EnumAttributes[].Description);
}
return MvcHtmlString.Create(obj.ToString());
}

这样在视图里出来的效果就是枚举类型里头定义的Description了:"出库""入库",还不影响数据库里的整型字段,又不影响程序里头的io=InOrOut.In这样的表述,多爽!

可是如果我的项目里头定义了多个枚举类型,比如还有一个操作状态:

    public enum LogStatus
{
[Description("操作未确定")]
UnConfirmed = -1,
[Description("操作取消")]
Cancel = 0,
[Description("操作已确定")]
Confirmed = 1
}

  那么也想把数据库中取得的字段值显示为该枚举的Description或者Name,势必又要定义一个大部分代码重复的DisplayLogStatus()的方法,能不能直接把枚举类型的名称作为变量带进方法呢?在方法里头再根据传入的名称还原出该枚举类型来。

我试了可以用该方法根据枚举类型的名称获得枚举类型:

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));
}

于是我在视图里这么用还挺爽的:

@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 > )
{
return MvcHtmlString.Create(EnumAttributes[].Description);
} //如果只是要简单的返回枚举的Name值就只要这一行了
return MvcHtmlString.Create(Enum.GetName(enumType, value));
}

视图里的调用改成就行了:

@Html.DisplayEnumDescription("LogStatus", item.Status)
@Html.DisplayEnumDescription("InOrOut", item.InOrOut)

从一个int值显示相应枚举类型的名称或者描述的更多相关文章

  1. Java源码中的发现:快速判断一个int值是几位数

    判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...

  2. 获取枚举类型Description特性的描述信息

    C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExten ...

  3. Java实现汉诺塔移动,只需传一个int值(汉诺塔的阶)

    public class HNT { public static void main(String[] args) { HNT a1 = new HNT(); a1.lToR(10); //给汉诺塔a ...

  4. Effective Java 第三版——34. 使用枚举类型替代整型常量

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  5. java 枚举类型知识点记录

    在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum.枚举类型是由一组固定的常量组成的类型.枚举本质是int值.因为枚举类型没有可以访问的构造器,所以枚举类 ...

  6. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  7. java枚举类型学习

    用的不多,但用的时候仅仅简单的使用,不太明白原理,今天就系统的学一下枚举.参考:java编程思想. Update: 枚举可以当做数据字典来存储,通常只要一个字段即instance本身,toString ...

  8. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  9. C#之枚举类型

    参考: http://www.cnblogs.com/an-wl/archive/2011/04/14/2015815.html 惯例先上MSDN: https://msdn.microsoft.co ...

随机推荐

  1. 关于django xadmin的学习改造(菜单名称,更改默认前缀数据库)

    路径xadmin-master\demo_app\app\models.py class c(models.Model): ip_address = models.CharField(max_leng ...

  2. 第四篇T语言实例开发,自动加血

    游戏自动加血 基础知识复习 通过前面的学习了解以下内容: TC软件的基本使用 TC的基础语法 变量与常量 功能的使用 流程语句的使用 线程的基本使用 TC控件的基本使用 热键和按钮的事件功能 控件的数 ...

  3. SQL EXEC 命令用法

    EXEC命令有两个用法: 1.执行一个存储过程,或者执行一个动态批次. 2.批次是一个内容为SQL语句的字符串. 举列子: 1.exec name_proc :没有参数 exec name_proc ...

  4. Quartz conTrigger 定时器表达式大全

    CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明   是否必填  允许填写的值 允许的通配符   1  秒  是  0-59    , ...

  5. redis之(二十一)redis之深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  6. visual studio 的Error List 显示乱码

    复制到右键菜单如下: Severity Code Description Project File LineError 閿欒: 绋嬪簭鍖卌om.baidu.lbsapi.auth涓嶅瓨鍦? com. ...

  7. 远程调试js注意事项

    1:使用host切换工具,先注释掉93服务器的地址,打开链接,点击高级选项,进去后登陆账号密码(如果不行重启浏览器): 2:进入后,增加93服务器上的host地址,重启浏览器,css样式生效: 3:使 ...

  8. python之元编程(元类实例)

    本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保 ...

  9. Go语言学习笔记1 变量,类型以及赋值

    1.变量 1.1 声明变量 使用var关键字可以创建一个指定类型的变量: var i int = 0 var i = 0 var i int 以上三个表达式均是合法的,第三个表达式会将i初始化为int ...

  10. [zz]利用碎片时间健身

    利用碎片时间健身(上) http://v.163.com/zixun/V96957QH6/VBSQ4D861.html#from=zixunplay_recommended 利用碎片时间健身(下) h ...