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

ASP.NET Core 7 Web API错误消息属性名本地化失效问题求助

问题原因

默认的AddDataAnnotationsLocalization()配置仅会在Web API所在的webapi.dll程序集中查找本地化资源,但你的DTO类位于独立的Dto.dll,且[Display]属性指定的Strings资源也在该程序集中。本地化服务无法自动跨程序集定位到资源,导致属性名的本地化失效;而验证消息因为直接在属性标记中明确指定了ErrorMessageResourceType,所以能正确找到对应资源。

解决方案

修改AddDataAnnotationsLocalization的配置,自定义本地化提供程序,让它能定位到Dto程序集中的资源:

方案1:按程序集匹配

builder.Services.AddControllers()
    .AddDataAnnotationsLocalization(options =>
    {
        options.DataAnnotationLocalizerProvider = (type, factory) =>
        {
            // 判断当前类型是否属于Dto程序集
            if (type.Assembly.GetName().Name == "Dto")
            {
                // 加载Dto程序集中的Strings资源
                return factory.Create("Strings", type.Assembly.FullName);
            }
            // 其他类型使用默认逻辑
            return factory.Create(type);
        };
    })
    .AddViewLocalization();

方案2:按Display属性的ResourceType匹配

这种方式更通用,适用于多程序集有不同资源文件的场景:

builder.Services.AddControllers()
    .AddDataAnnotationsLocalization(options =>
    {
        options.DataAnnotationLocalizerProvider = (type, factory) =>
        {
            // 获取当前类型的Display属性,提取指定的ResourceType
            var displayAttribute = type.GetCustomAttributes(typeof(DisplayAttribute), inherit: true)
                .Cast<DisplayAttribute>()
                .FirstOrDefault();
            
            if (displayAttribute?.ResourceType != null)
            {
                return factory.Create(displayAttribute.ResourceType);
            }
            
            // 无指定ResourceType时使用默认逻辑
            return factory.Create(type);
        };
    })
    .AddViewLocalization();
额外检查项
  • 确保Strings.resx的自定义工具设置为PublicResXFileCodeGenerator,生成的Strings类是public访问级别(右键资源文件→属性→自定义工具)。
  • 确认资源文件的命名符合多语言规范(如Strings.zh-CN.resx),且Web API的当前文化已正确设置(可通过RequestLocalization中间件配置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:46