views:

938

answers:

2

Hello, this is my first question on here so be gentle!

Im using asp.net 3.5, my solution currently has 2 projects, an API class project and a website project, within the class project i have a resource file named checkin.resx. For me to be able to access the resource files from my website project, i had to set the "Access Modifier" to public, this allowed me to use a strongly typed name to acces the resources for example: CkiApi.Checkin.Resources.Checkin.OCKI_HeaderText, where Checkin is the .resx file and OCKI_HeaderText is the resource key.

The problem im facing is that im unable to access the resources from front end aspx code, for example, settign a text property of a label or a validation error message. I have tried the following syntax to no avail:

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

the error i get is "The resource object with key 'OCKI_IdentificationMethod' was not found." but regardless of what i set the class name to, i get the same error, im thinking its because its trying to look in the website project but i cant figure out how to tell it to look at the API! Can anyone help?!

i am able to set non server side tags using the following:

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

Many Thanks!

A: 

Not sure if this will solve your problem but have you looked at the HttpContext.GetGlobalResourceObject method?

I've used it to access resources in the web project, from class libraries in a framework project - so perhaps you will have luck in using it the other way around.

Winston Smith
Thank you for your reply, but unfortuantely i beleive this functionality is the same as using <%$ Resources : <class>, <key> %>, also, i wouldnt be able to bind <%= or <%# tags to a server-side attribute :(
Raj
+3  A: 

Resource expressions (<%$ Resources: ClassKey, ResourceKey %>) use ResourceExpressionBuilder class behind the scene. This class can lookup global and local resources only (in website's App_GlobalResources and App_LocalResources folders).

Instead, you can use CodeExpressionBuilder class to access resources from different project. Here's how to use it.

Add CodeExpressionBuilder class to App_Code folder:

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);
   }
}

Add the following to system.web/compilation section in web.config:

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

Finally, you can call into strongly-typed class generated for your .resx file:

<asp:Label ID="Label1" runat="server" Text="<%$ Code: ClassLibrary1.Resource1.String1 %>" />
Pavel Chuchuva
Thank you very much, works a treat :-)
Raj