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

多项目ASP.NET解决方案中资源文件访问异常问题求助

解决ASP.NET站点地图和HTML控件访问类库资源的问题

我之前也遇到过一模一样的问题——ASP.NET默认的$Resources表达式只会盯着当前Web项目的资源文件,对类库里面的公共资源根本“视而不见”。下面是我亲测有效的解决方法,分步骤来:

1. 自定义资源提供者工厂

我们需要写一个自定义的ResourceProviderFactory,让ASP.NET知道去哪里找类库中的资源。在你的Common.Resources项目中添加以下代码:

using System;
using System.Web.Compilation;
using System.Resources;

namespace Common.Resources
{
    public class ExternalResourceProviderFactory : ResourceProviderFactory
    {
        public override IResourceProvider CreateGlobalResourceProvider(string classKey)
        {
            // 匹配我们的资源类名(Strings)
            if (classKey.Equals("Strings", StringComparison.OrdinalIgnoreCase))
            {
                return new ExternalResourceProvider(typeof(Strings));
            }
            // 其他资源还是用默认的提供者
            return base.CreateGlobalResourceProvider(classKey);
        }

        public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
        {
            return base.CreateLocalResourceProvider(virtualPath);
        }
    }

    public class ExternalResourceProvider : IResourceProvider
    {
        private readonly Type _resourceType;
        private ResourceManager _resourceManager;

        public ExternalResourceProvider(Type resourceType)
        {
            _resourceType = resourceType;
        }

        public object GetObject(string resourceKey, System.Globalization.CultureInfo culture)
        {
            return ResourceManager.GetObject(resourceKey, culture);
        }

        public ResourceManager ResourceManager
        {
            get
            {
                if (_resourceManager == null)
                {
                    _resourceManager = new ResourceManager(_resourceType);
                }
                return _resourceManager;
            }
        }
    }
}

2. 在Web.config中注册自定义工厂

打开Web项目的Web.config,找到<system.web>节点下的<compilation>标签,添加资源提供者工厂的配置:

<system.web>
  <compilation debug="true" targetFramework="4.8">
    <!-- 注册自定义资源提供者工厂 -->
    <resourceProviderFactory type="Common.Resources.ExternalResourceProviderFactory, Common.Resources" />
  </compilation>
  <!-- 其他已有配置保持不变 -->
</system.web>

注意:targetFramework要改成你实际使用的版本,比如4.7.2或者.NET Framework的其他版本。

3. 站点地图和HTML控件中的使用

配置完成后,你就可以像在代码中一样简洁地使用资源表达式了:

  • 站点地图(sitemap):直接用$Resources:Strings, MyResourceStringNameHere,不需要加命名空间前缀
    <siteMapNode url="~/Home" title="$Resources:Strings, HomePageTitle" description="$Resources:Strings, HomePageDesc" />
    
  • ASP.NET服务器控件:比如Label、Button的Text属性
    <asp:Label ID="lblWelcome" runat="server" Text="<%$ Resources:Strings, WelcomeMessage %>"></asp:Label>
    

关键注意事项

  • 确保Common.Resources项目中的资源文件:
    • 生成操作设置为嵌入的资源
    • 自定义工具设置为PublicResXFileCodeGenerator(你已经设置为公共资源,这个应该已经配置好了)
  • 确认Web项目已经正确引用了Common.Resources项目,并且解决方案编译没有报错
  • 如果是多语言资源(比如Strings.en.resx),ASP.NET会自动根据当前请求的文化加载对应的资源,和代码中的逻辑一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:00:55