16

我正在使用 asp.net 3.5,我的解决方案目前有 2 个项目,一个 API 类项目和一个网站项目,在类项目中我有一个名为 checkin.resx 的资源文件。为了能够从我的网站项目访问资源文件,我必须将“访问修饰符”设置为公共,这允许我使用强类型名称来访问资源,例如:CkiApi.Checkin.Resources.Checkin.OCKI_HeaderText,其中 Checkin 是 .resx文件和 OCKI_HeaderText 是资源键。

我面临的问题是我无法从前端 aspx 代码访问资源,例如,设置标签的文本属性或验证错误消息。我尝试了以下语法无济于事:

<asp:Label AssociatedControlID="IdentMethods" EnableViewState="false" ID="lblIdentMethod" runat="server" Text="<%$ Resources: CkiApi.Checkin.Resources.Checkin, OCKI_IdentificationMethod %>"></asp:Label>

我得到的错误是

找不到键为“OCKI_IdentificationMethod”的资源对象。

但无论我将类名设置为什么,我都会遇到同样的错误,我认为它是因为它试图查看网站项目,但我不知道如何告诉它查看 API!任何人都可以帮忙吗?

我可以使用以下设置非服务器端标签:

<div id="OckiIntroText">
    <%=CkiApi.Checkin.Resources.Checkin.OCKI_IntroText%>
</div>
4

2 回答 2

18

资源表达式 ( )在幕后<%$ Resources: ClassKey, ResourceKey %>使用ResourceExpressionBuilder类。此类只能查找全局和本地资源(在网站App_GlobalResourcesApp_LocalResources文件夹中)。

相反,您可以使用CodeExpressionBuilder类来访问来自不同项目的资源。以下是如何使用它。

将 CodeExpressionBuilder 类添加到 App_Code 文件夹:

using System.CodeDom;
using System.Web.Compilation;
using System.Web.UI;

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
   public override CodeExpression GetCodeExpression(BoundPropertyEntry entry,
      object parsedData, ExpressionBuilderContext context)
   {
      return new CodeSnippetExpression(entry.Expression);
   }
}

将以下内容添加到 web.config 中的 system.web/compilation 部分:

<compilation debug="false">
   ...
   <expressionBuilders>
      <add expressionPrefix="Code" type="CodeExpressionBuilder"/>
   </expressionBuilders>
</compilation>

最后,您可以调用为您的 .resx 文件生成的强类型类:

<asp:Label ID="Label1" runat="server" Text="<%$ Code: ClassLibrary1.Resource1.String1 %>" />
于 2009-08-04T06:45:03.980 回答
3

不确定这是否能解决您的问题,但您是否查看过HttpContext.GetGlobalResourceObject方法?

我已经使用它从框架项目中的类库中访问 Web 项目中的资源 - 所以也许你会以相反的方式使用它。

于 2009-08-03T14:16:14.053 回答