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

ASP.NET Core多子项目下Resources资源路径配置错误如何解决

问题原因

ASP.NET Core 本地化组件默认会以启动项目的根命名空间为前缀,拼接你配置的ResourcesPath生成资源查找全路径。你的启动项目是Main,根命名空间默认为Main,因此框架默认查找路径为Main.Resources.<资源对应类的路径后缀>,和你预期的Resources.<资源路径>规则不匹配,不需要合并项目即可解决。

解决方案

方案1:配置资源程序集+修正命名空间(无侵入,推荐)

  1. 首先确认Resources是独立类库项目,打开该项目的.csproj文件,在<PropertyGroup>节点下添加配置,将资源项目的根命名空间明确设置为Resources:
    <RootNamespace>Resources</RootNamespace>
    
  2. 将所有.resx文件的生成操作设置为嵌入的资源,避免框架扫描不到文件。
  3. 修改启动项目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:自定义资源定位规则(适配不想修改项目命名空间的场景)

如果不想调整资源项目的根命名空间,可以替换框架默认的资源名称定位逻辑,自动去掉查找路径里多余的启动项目前缀:

  1. 实现自定义资源名称提供器:
    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;
        }
    }
    
  2. 在服务配置中替换默认实现:
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(options => options.ResourcesPath = "Resources");
        // 替换默认资源定位逻辑
        services.Decorate<IResourceNames, PrefixTrimmedResourceNames>();
        // 其余Mvc、本地化相关配置保持不变
    }
    
校验规则

配置完成后,资源查找会自动匹配你现有的目录映射关系:

  • Main.Controllers.MainController 对应资源 Resources.Controllers.MainController.resx
  • Common.Services.CommonServices 对应资源 Resources.Services.CommonServices.resx

不需要调整现有文件位置,也不需要合并拆分的项目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:06:55