zoukankan      html  css  js  c++  java
  • 从一个int值显示相应枚举类型的名称或者描述

    我正在做一个出入库管理的简单项目,在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标签,为什么不好好利用呢?

    增加这个命名空间:

    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这样的表述,多爽!

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

        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 > 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)
  • 相关阅读:
    linux中ll和du的区别
    django+celery+redis环境搭建
    python中若干错误
    js正则表达式中匹配反引号
    yii学习小结
    linux下DNS设置以及解析顺序
    apache中若干模块的安装
    HTML基础
    selenium
    selenium
  • 原文地址:https://www.cnblogs.com/hulu/p/3850269.html
Copyright © 2011-2022 走看看