2009-08-03 3 views
15

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить доступ к ресурсам из кода 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> 

ответ

17

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

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

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

+0

Спасибо за ваш ответ, но, к сожалению, я верю в этот функционал y совпадает с использованием <% $ Ресурсы: , %>, также, я бы не смог привязать теги <% = или <% # к атрибуту на стороне сервера :( – Raj

Смежные вопросы