Доступ к ресурсам ресурсов resx из другого проекта

Я использую asp.net 3.5, у моего решения в настоящее время есть 2 проекта, проект класса API и проект веб-сайта, в рамках проекта класса у меня есть файл ресурсов с именем checkin.resx. Для меня, чтобы иметь доступ к файлам ресурсов из моего проекта веб-сайта, мне пришлось публиковать "Модификатор доступа", это позволило мне использовать строго типизированное имя для доступа к ресурсам, например: CkiApi.Checkin.Resources.Checkin.OCKI_HeaderText, где Checkin is файл .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>

Ответы

Ответ 1

Выражения ресурсов (<%$ Resources: ClassKey, ResourceKey %>) используют ResourceExpressionBuilder класс за сценой. Этот класс может искать только глобальные и локальные ресурсы (в папках веб-сайта App_GlobalResources и App_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);
   }
}

Добавьте следующее в раздел system.web/компиляции в web.config:

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

Наконец, вы можете вызвать строго типизированный класс, сгенерированный для вашего файла .resx:

<asp:Label ID="Label1" runat="server" Text="<%$ Code: ClassLibrary1.Resource1.String1 %>" />

Ответ 2

Не уверен, что это решит вашу проблему, но вы просмотрели метод HttpContext.GetGlobalResourceObject?

Я использовал его для доступа к ресурсам в веб-проекте, из библиотек классов в рамках проекта framework, поэтому, возможно, вам удастся использовать его другим способом.