2009-08-03 171 views
15

我正在使用asp.net 3.5,我的解決方案目前有2個項目,一個API類項目和一個網站項目,在類項目中我有一個名爲checkin.resx的資源文件。爲了能夠從我的網站項目訪問資源文件,我必須將「訪問修飾符」設置爲公開,這允許我使用強類型名稱來訪問資源,例如:CkiApi.Checkin.Resources.Checkin.OCKI_HeaderText,其中籤入是。 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_GlobalResourcesApp_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); 
    } 
} 

添加web.config中的以下內容的System.Web /編譯部分:

<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方法?

我用它從框架項目中的類庫中訪問Web項目中的資源 - 所以也許你會反過來使用它。

+0

謝謝您的回覆,但不幸的是我beleive這個函數y與使用<%$ Resources:,%>相同,另外,我不能將<%=或<%#標籤綁定到服務器端屬性:( – Raj 2009-08-03 15:07:18

相關問題