ASP.NET Core多子项目下Resources资源路径配置错误如何解决
问题原因
ASP.NET Core 本地化组件默认会以启动项目的根命名空间为前缀,拼接你配置的ResourcesPath生成资源查找全路径。你的启动项目是Main,根命名空间默认为Main,因此框架默认查找路径为Main.Resources.<资源对应类的路径后缀>,和你预期的Resources.<资源路径>规则不匹配,不需要合并项目即可解决。
解决方案
方案1:配置资源程序集+修正命名空间(无侵入,推荐)
- 首先确认
Resources是独立类库项目,打开该项目的.csproj文件,在<PropertyGroup>节点下添加配置,将资源项目的根命名空间明确设置为Resources:<RootNamespace>Resources</RootNamespace> - 将所有
.resx文件的生成操作设置为嵌入的资源,避免框架扫描不到文件。 - 修改启动项目
Startup.cs里的本地化注册逻辑,显式指定资源所在的程序集:
该配置下框架会直接从根命名空间为public void ConfigureServices(IServiceCollection services) { // 加载资源项目所在的程序集 var resourceAssembly = typeof(Resources.Controllers.MainController).Assembly; services.AddLocalization(options => options.ResourcesPath = ""); services.AddControllersWithViews() // 注册资源程序集为应用部件,让框架可以扫描到嵌入的资源 .AddApplicationPart(resourceAssembly) .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) .AddDataAnnotationsLocalization(); }Resources的程序集里查找对应路径的资源,完全匹配你现有的目录结构。
方案2:自定义资源定位规则(适配不想修改项目命名空间的场景)
如果不想调整资源项目的根命名空间,可以替换框架默认的资源名称定位逻辑,自动去掉查找路径里多余的启动项目前缀:
- 实现自定义资源名称提供器:
using System.Globalization; using Microsoft.Extensions.Localization; public class PrefixTrimmedResourceNames : IResourceNames { private readonly IResourceNames _innerProvider; private const string TrimPrefix = "Main."; public PrefixTrimmedResourceNames(IResourceNames innerProvider) { _innerProvider = innerProvider; } public IList<string> GetAllNames(CultureInfo culture) => _innerProvider.GetAllNames(culture); public string? GetResourceName(Type type, out string? searchedLocation) { var resourceName = _innerProvider.GetResourceName(type, out searchedLocation); if (!string.IsNullOrEmpty(resourceName) && resourceName.StartsWith(TrimPrefix)) { resourceName = resourceName.Substring(TrimPrefix.Length); searchedLocation = resourceName; } return resourceName; } } - 在服务配置中替换默认实现:
public void ConfigureServices(IServiceCollection services) { services.AddLocalization(options => options.ResourcesPath = "Resources"); // 替换默认资源定位逻辑 services.Decorate<IResourceNames, PrefixTrimmedResourceNames>(); // 其余Mvc、本地化相关配置保持不变 }
校验规则
配置完成后,资源查找会自动匹配你现有的目录映射关系:
Main.Controllers.MainController对应资源Resources.Controllers.MainController.resxCommon.Services.CommonServices对应资源Resources.Services.CommonServices.resx
不需要调整现有文件位置,也不需要合并拆分的项目。
内容的提问来源于stack exchange,提问作者Muhammad Jabareen
相关产品推荐
相关产品推荐

