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

