從一個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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM