2009-08-03 21 views
15

Używam asp.net 3.5, moje rozwiązanie ma obecnie 2 projekty, projekt klasy API i projekt strony internetowej, w ramach projektu klasy Mam plik zasobów o nazwie checkin.resx. Aby móc uzyskać dostęp do plików zasobów z mojego projektu strony internetowej, musiałem ustawić "modyfikator dostępu" na publiczny, co pozwoliło mi użyć nazwy ściśle nazwanej, aby uzyskać dostęp do zasobów, na przykład: CkiApi.Checkin.Resources.Checkin.OCKI_HeaderText, gdzie Checkin jest. Plik Resx i OCKI_HeaderText to klucz zasobów.Dostęp do plików zasobów resx z innego projektu

Problem, przed którym stoję, polega na tym, że nie mogę uzyskać dostępu do zasobów z frontowego kodu aspx, na przykład ustawiając właściwość tekstową etykiety lub komunikat o błędzie sprawdzania poprawności. Próbowałem następującą składnię bezskutecznie:

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

błąd pojawia się to

Przedmiotem zasób z kluczem „OCKI_IdentificationMethod” nie została znaleziona.

ale niezależnie od tego, jakie ustawić nazwę klasy do, otrzymuję ten sam błąd, myślę, że jego ponieważ jego próbując spojrzeć w projekcie strony, ale nie mogę dowiedzieć się, jak powiedzieć to patrzeć w API! Czy ktoś może pomóc?

jestem w stanie ustawić znaczniki niż po stronie serwera przy użyciu następujących:

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

Odpowiedz

17

Wyrażenia zasobów (<%$ Resources: ClassKey, ResourceKey %>) używają klasy ResourceExpressionBuilder za sceną. Ta klasa może wyszukiwać tylko zasoby globalne i lokalne (w folderach witryny App_GlobalResources i App_LocalResources).

Zamiast tego można użyć klasy CodeExpressionBuilder, aby uzyskać dostęp do zasobów z innego projektu. Oto jak z niego korzystać.

Dodaj klasę CodeExpressionBuilder w folderze 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); 
    } 
} 

dodać następujące system.Web/section kompilacji w pliku web.config:

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

Wreszcie, można zadzwonić do silnie wpisany klasy wygenerowany dla twojego pliku .resx:

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

Nie wiem, czy to rozwiąże problem, ale nie spojrzał na metodzie HttpContext.GetGlobalResourceObject?

Użyłem go do uzyskania dostępu do zasobów w projekcie internetowym, z bibliotek klas w projekcie szkieletowym - więc być może będziesz miał szczęście, używając go w inny sposób.

+0

Dziękuję za odpowiedź, ale niestety wierzę w tę funkcjonalność y jest tym samym, co użycie <% $ Resources: , %>, także nie byłbym w stanie powiązać znaczników <% = lub <% # z atrybutem po stronie serwera :( – Raj

Powiązane problemy