Доступ к файлам ресурсов resx из другого проекта - PullRequest
15 голосов
/ 03 августа 2009

Я использую 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>

Ответы [ 2 ]

18 голосов
/ 04 августа 2009

Выражения ресурса (<%$ 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 / compilation в 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 %>" />
3 голосов
/ 03 августа 2009

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

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

...