在 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 中使用枚举和资源文件显示全名的主要内容,如果未能解决你的问题,请参考以下文章