簡體   English   中英

如何在自定義服務器控件 asp 中使用 .resx 和 .resource 文件?

[英]How to use .resx and .resource files in custom server control asp?

我正在編寫自己的服務器端控件,並且正在使用存儲在.resx文件中的圖像。 在控制台應用程序中,此代碼工作正常:

     ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
        
     foreach (DictionaryEntry d in rsxr)
     {
        Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
     }

     rsxr.Close();

但在這里

      protected override void RenderContents(HtmlTextWriter output)
    {
        ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
  
        base.RenderContents(output);

        foreach (DictionaryEntry d in rsxr)
        {
            output.Write(d.Key.ToString());
        }
        
    }

我收到此錯誤:

找不到文件“C:\\Program Files\\Common Files\\Microsoft Shared\\DevServer\\10.0\\Resource1.resx”

我嘗試使用 ResourceManager,但它需要一個.resource文件。 我無法訪問resgen工具(命令提示符不理解resgen命令)並安裝它(在嘗試期間出現一些錯誤)。

我的問題是:

  1. 為什么我無法讀取.resx

  2. 如何正確安裝resgen工具?

謝謝。

將資源文件存儲在應用程序根目錄中的App_GlobalResources文件夾下或與用戶控制文件同名的App_LocalResources被認為是一種很好的做法。 因此,例如用戶用戶控件是本地資源文件夾中的 uc.ascx 文件應該是 uc.ascx.resx。 這樣維護起來更容易,而且asp.net 會自動檢測到它。

現在你的答案是:

第一個問題:使用Server.MapPath("~/")直接指向 web.config 所在的物理位置。 如果要使用 Controls 文件夾中的資源文件,則必須編寫Server.MapPath("~/Controls/Resource1.resx")以獲取路徑。

不確定您想用 resgen 工具做什么? 編譯應用程序時,也會編譯資源文件。 選擇您的資源文件並單擊 F4,它將顯示您的構建操作,在構建操作中選擇資源,您的資源文件將包含在程序集中。

您可以查看此帖子以獲取更多信息: 如何在 asp.net 網站中使用圖像資源?

根據您的描述,我了解到您需要找到並訪問用戶控件的資源文件。 我發現它可以通過以下方式很好地工作:

  1. 在項目級別創建App_GlobalResources (通過上下文菜單Add -> Add ASP.NET Folder -> App_GlobalResources

  2. 創建與控件同名的資源文件,但在App_GlobalResources 內 例如,如果控件名為myControl.ascx ,則默認語言的資源文件名稱必須為myControl.ascx.resx

  3. 為您需要的每種語言創建額外的資源文件。 例如,如果您需要德語(“ de-DE ”),則添加 myControl.ascx.de.resx

  4. 添加類MultiLanguageUserControl如下:

     public class MultiLanguageUserControl : System.Web.UI.UserControl { public string getResValue(string id) { var ctrlPath = TemplateControl.AppRelativeVirtualPath; var ctrlFile = System.IO.Path.GetFileName(ctrlPath); var resObj = GetGlobalResourceObject(ctrlFile, id); if (resObj!=null) return resObj.ToString(); else return string.Format("UNRESOLVED[{0}]", id); } }
  5. 打開 myControl 背后的代碼並使其繼承自MultiLanguageUserControl而不是System.Web.UI.UserControl

    public partial class myControl : MultiLanguageUserControl { //... }

  6. 在 HTML 代碼中,使用新函數,例如: <%=getResValue("resid")%> ,其中"resid"是您要查找的資源字符串的名稱。 您還可以使用 HTML 編碼標記<%:代替<%= ,具體取決於您的要求。 或者,您可以在用戶控件中服務器端 C# 代碼的任何位置使用getResValue從資源文件中檢索值。

  7. 確保在使用用戶控件的頁面的Page_Load事件中支持語言檢測。 此處描述如何執行此操作(查找函數InitializeCulture )。

注意:如果您想從用戶控件內部讀取頁面的本地資源字符串,請查看此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM