ASP.NET Core MVC(.NET6)跨类库DataAnnotations本地化不生效问题
结论
ASP.NET Core 原生支持主Web应用之外的类库中Models的DataAnnotations本地化,你当前配置失效的核心原因是默认无参调用AddDataAnnotationsLocalization()时,框架只会关联启动项目(MyApp.Web)的资源查找逻辑,不会自动匹配引用类库内的嵌入资源。
实现步骤
1. 类库侧资源配置
- 在
MyApp.DAL类库根目录新建Resources文件夹,资源文件的存放路径和类库内Models的命名空间结构保持一致:比如MyApp.DAL.Models.User类对应的英文、丹麦语资源文件,存放路径为MyApp.DAL/Resources/Models/User.en-GB.resx、MyApp.DAL/Resources/Models/User.da-DK.resx - 选中所有resx资源文件,在属性面板将「生成操作」设置为嵌入的资源,确保资源会随类库程序集一起编译
- 确认resx文件的生成命名空间和类的完整命名空间匹配,避免资源查找失败
2. Program.cs 配置修改
只需修改AddDataAnnotationsLocalization的注册逻辑,让本地化提供器根据当前待验证的模型类型所属的程序集自动查找对应资源即可,修改后可同时支持Web项目内ViewModels和DAL类库内Models的DataAnnotations本地化。
修改后的完整Program.cs代码如下:
builder.Services.AddLocalization(opt => { opt.ResourcesPath = "Resources"; }); builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new List<CultureInfo> { new CultureInfo("en-GB"), new CultureInfo("da-DK"), }; options.DefaultRequestCulture = new RequestCulture(culture: "en-GB", uiCulture: "en-GB"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); builder.Services.AddControllersWithViews() .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) // 调整DataAnnotations本地化配置,支持跨程序集查找资源 .AddDataAnnotationsLocalization(options => { options.DataAnnotationLocalizerProvider = (modelType, localizerFactory) => localizerFactory.Create(modelType); }); builder.Services.AddRazorPages() .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) // Razor Pages 同步调整DataAnnotations配置 .AddDataAnnotationsLocalization(options => { options.DataAnnotationLocalizerProvider = (modelType, localizerFactory) => localizerFactory.Create(modelType); }); var app = builder.Build(); app.UseRequestLocalization(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.Run();
注意事项
- 无需将DAL类库的资源文件复制到Web项目,资源作为嵌入资源打包在DAL程序集内即可被框架正常识别
- 若单个模型的本地化字符串不生效,优先检查对应resx文件的生成操作是否为「嵌入的资源」、资源文件命名和路径是否与模型类的完整命名空间匹配
内容的提问来源于stack exchange,提问作者Simant
相关产品推荐
相关产品推荐

