You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DisplayAttribute本地化失败:无法获取'Name'属性异常求助

解决ViewModel中使用DisplayAttribute引用类库资源时的本地化异常问题

你遇到的这个InvalidOperationException确实有点棘手——明明已经按照常规方案把资源类设为公共、配置了PublicResXFileCodeGenerator,但还是报错。结合你给出的代码细节,我注意到几个容易被忽略的关键点,尤其是你**手动创建了空的SharedResources.cs**这一点,大概率是问题的核心,下面给你逐一排查解决方案:

1. 移除手动创建的空SharedResources.cs,依赖自动生成的Designer类

你手动写的空SharedResources.cs会和PublicResXFileCodeGenerator自动生成的SharedResources.Designer.cs产生类定义冲突。自动生成的Designer类应该包含完整的资源访问逻辑,比如:

namespace Common {
    public class SharedResources {
        private static global::System.Resources.ResourceManager resourceManager;
        private static global::System.Globalization.CultureInfo resourceCulture;

        public static global::System.Resources.ResourceManager ResourceManager {
            get {
                if (object.ReferenceEquals(resourceManager, null)) {
                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Common.SharedResources", typeof(SharedResources).Assembly);
                    resourceManager = temp;
                }
                return resourceManager;
            }
        }

        public static global::System.Globalization.CultureInfo Culture {
            get {
                return resourceCulture;
            }
            set {
                resourceCulture = value;
            }
        }

        public static string Common_From {
            get {
                return ResourceManager.GetString("Common_From", resourceCulture);
            }
        }
        // 其他资源键对应的静态属性
    }
}

手动的空类会覆盖或者干扰这个自动生成的类,导致DisplayAttribute找不到对应的公共静态属性。建议直接删除你手动创建的SharedResources.cs,让工具自动生成完整的公共类。

2. 确认资源文件的「自定义工具命名空间」配置

右键类库中的SharedResources.resx → 打开属性面板,检查自定义工具命名空间(Visual Studio中)是否和你ViewModel中引用的命名空间一致。比如你的Common项目默认命名空间是Common,那么这个值也应该设为Common,确保自动生成的SharedResources类在正确的命名空间下,ViewModel里的typeof(SharedResources)才能精准定位到它。

3. 验证类库引用与编译状态

确保ViewModel所在的项目(Web项目或独立ViewModel项目):

  • 正确引用了Common类库,不是过时的引用;
  • 解决方案已经清理并重新生成过——有时候类库更新后没重新编译,ViewModel项目会引用旧版本的DLL,导致资源属性无法被找到。

4. 直接测试资源访问,排除DisplayAttribute的特殊问题

在ViewModel项目中写一段简单的测试代码,直接访问资源类的静态属性:

var testResource = Common.SharedResources.Common_From;

如果这段代码编译报错或运行时异常,说明问题出在类库的资源配置上(比如命名空间、类访问修饰符);如果能正常获取值,那可以尝试在DisplayAttribute中使用完全限定的命名空间:

[Display(ResourceType = typeof(Common.SharedResources), Name = "Common_From")]
public DateTime? FromDate { get; set; }

避免因为命名空间引用缺失导致的类型查找失败。

5. 检查资源键的拼写与大小写

虽然你说替换成普通字符串也报错,但还是要确认SharedResources.resx中确实存在Common_From这个资源键,并且大小写完全匹配——资源键是严格区分大小写的,哪怕一个字母大小写错误,都会导致找不到对应的属性。


内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:27:59