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
相关产品推荐
相关产品推荐

