在 C# MVC 中使用枚举和资源文件显示全名

Posted

技术标签:

【中文标题】在 C# MVC 中使用枚举和资源文件显示全名【英文标题】:Displaying the full name with Enums and resource file in c# MVC 【发布时间】:2015-07-14 11:42:49 【问题描述】:

再试一次

我有一个 Enums.cs 文件,其中包含以下代码

public enum AuthorizingLevels
    
        [Display(Name = "AuthorizingLevels_SysSupport", ResourceType = typeof(Resources.Enums))]
        SysSupport
    

当我尝试调用它来显示名称时,它不起作用

ViewBag.AuthGroupFullName = Enums.AuthorizingLevels.SysSupport.ToString();

它只显示 SysSupport 而不是全名 Systems Support

我转到上一个问题 (How to get the Display Name Attribute of an Enum member via MVC razor code?) 中提供的链接并添加了 Peter Kerr 的代码

/// <summary>
    ///     A generic extension method that aids in reflecting 
    ///     and retrieving any attribute that is applied to an `Enum`.
    /// </summary>
    public static string GetDisplayName(this Enum enumValue)
    
        var displayAttrib = enumValue.GetType()
                        .GetMember(enumValue.ToString())
                        .First()
                        .GetCustomAttribute<DisplayAttribute>();
        var name = displayAttrib.Name;
        var resource = displayAttrib.ResourceType;

        return String.IsNullOrEmpty(name) ? enumValue.ToString()
            : resource == null ? name
            : new ResourceManager(resource).GetString(name);
    

但是,我在线上遇到错误

: new ResourceManager(resource).GetString(name);

“System.Resources.MissingManifestResourceException”类型的异常发生在 mscorlib.dll 中,但未在用户代码中处理 附加信息:找不到任何适合指定文化或中性文化的资源。确保“Resources.Enums.resources”在编译时被正确嵌入或链接到程序集“FWS”中,或者所有需要的附属程序集都是可加载的并且是完全签名的。

资源文件是正确的减去最后的 .resources...不确定是否应该存在。

我做错了什么?我正在学习 MVC 和 c#,因此我们将不胜感激。

谢谢

【问题讨论】:

什么是 Resources.Enums? 这是我的资源页面,其中包含此特定枚举的全名。 我认为这是你的问题。我刚刚将您的代码粘贴到一个新的 c# 控制台项目中,将显示名称放在标准资源中并说 [Display(Name = "AuthorizingLevels_SysSupport", ResourceType = typeof(Resources))]。效果很好。 我收到一个错误,其中只有 Resources 说“'Resources' 是一个'命名空间',但用作'type'” 嗯,在开箱即用的项目中,“Resources”是由 Visual Studio 定义的标准类(通常在 Resources.Designer.cs 中)。那么你做了什么来获得资源页面? 【参考方案1】:

试试这个。它相当hacky,但希望它能给你你需要的东西。我使用Assembly.GetExecutingAssembly().GetManifestResourceNames() 来获取执行程序集中所有资源的名称,然后尝试使用一些linq 正确匹配文件。如果它找到一个看起来不错的文件,则会创建一个新的ResourceManager,就像您在原始代码中使用的那样。

/// <summary>
///     A generic extension method that aids in reflecting 
///     and retrieving any attribute that is applied to an `Enum`.
/// </summary>
public static string GetDisplayName(this Enum enumValue)

    var displayAttrib = enumValue.GetType()
        .GetMember(enumValue.ToString())
        .First()
        .GetCustomAttribute<DisplayAttribute>();

    var name = displayAttrib.Name;
    if (String.IsNullOrEmpty(name))
    
        return enumValue.ToString();
    
    else
    
        var resource = displayAttrib.ResourceType;
        if (resource != null)
        
            var resources = Assembly.GetExecutingAssembly().GetManifestResourceNames()
                .Where(x => x.EndsWith(String.Format("0.resources", resource.Name)))
                .Select(x => x.Replace(".resources", string.Empty)).ToList();
            if (resources.Any())
            
                return new ResourceManager(resources.First(), Assembly.GetExecutingAssembly()).GetString(name);
            
        

        return name;
    

【讨论】:

感谢您的帮助。我现在收到此错误“在 mscorlib.dll 中发生了‘System.MissingMethodException’类型的异常,但未在用户代码中处理...附加信息:没有为此对象定义无参数构造函数” @Karinne - 立即尝试。我已将 Activator 类替换为对 System.Runtime.Serialization.FormatterServices.GetUninitializedObject 的调用。 好的...现在我得到“FWS.dll 中发生“System.NullReferenceException”类型的异常,但未在用户代码中处理附加信息:对象引用未设置为对象的实例。” 如果您在遇到异常时在即时窗口中调用Assembly.GetExecutingAssembly().GetManifestResourceNames(),您是否在列表中看到您的枚举资源文件?您的 Enums 资源文件是否有 Custom Tool Namespace 是的,我的枚举文件在列表中 string[4] [0]: "FWS.App_GlobalResources.Enums.resources" 自定义工具命名空间为空

以上是关于在 C# MVC 中使用枚举和资源文件显示全名的主要内容,如果未能解决你的问题,请参考以下文章

C# - 从资源中读取和显示 HTML

C# 添加枚举中文资源

C# 中的 XML - 从资源中读取、操作和显示

在 WPF、C# 中使用文化访问资源文件

如何使用C#从asp.net MVC中的枚举绑定下拉列表[重复]

枚举嵌入资源目录中的文件