Доступ к ресурсам ресурсов 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, поэтому, возможно, вам удастся использовать его другим способом.