ASP.NET中操作.resx資源檔中的內容

ASP.NET中操作.resx資源檔中的內容

撰寫網頁程式,讓我一直覺得是非常奇妙的地方,因為每次撰寫的過程中都有可能遇到很多新鮮的事情,

例如:操作Linq、Linq to XML等等,也許是因為我自己的功力還不夠或是觀念不夠清楚才會有這種情形吧,

不過這些都不是重點,這次本篇要說的是:如何在ASP.NET中操作.resx資源檔中的內容。

 

透過「ASP.NET Web網頁資源概觀」內容可以得知在ASP.NET資源的內容分成二種:

‧GlobalResource

適合存放需要共享於程式間或網頁間所使用的內容,它也支援具有連結的資源(LocalResource不支援)。

ASP.NET 會針對它產生強型別 (Strongly Typed) 物件,讓程式可以在其他地方操作其中的內容。例如:

放置固定的內容、圖片路徑…等。

 

‧LocalResource

通常是綁定一個特定的ASP.NET Web網頁,讓做多國語系或單網頁操作資源時的情形下使用,讓資

源只限定於該網頁內使用,外部程式如果要存取就會發生Exception。透過它的來設定網頁內控件的

多國語系會比全部放在GlobalResource中來的好,因為這樣會造成GlobalResource長的太大了,而且

管理起來也沒有比特定網頁對應多語系檔來的好。

 

這二個資源檔通常會用於設計多國語系的網頁支援或是有些共用/特定的參數值會放置於其中,當然

有些相關於Server站台的設計內容就不會放置於此(例如:放置於web.cofig之中),因此,要操作這

二種資源檔有非常多的方式,我在下面將介紹其中幾種。

‧操作.resx的方式:

(1):透過GetLocalResourceObject()或GetGlobalResourceObject()

這個方法是直接透過在網頁程式(例如:Default.aspx.cs)中,直接使用Page中的支援的指令來進行

資源檔的操作,例如:

   1: // 透過GetGlobalResourceObject(),需要指定要使用的資源檔名稱,例如:strings,
   2: // 接著再指定要擷取的ResourceKey。
   3: string tGMessage = this.GetGlobalResourceObject("strings", "Message").ToString();
   4:  
   5: // 透過GetLocalResourceObject(),由於只限定於該網頁使用所相對應的資源檔,
   6: // 因此,不必指定資源檔。另外如果您有多語系的資源檔,它則會按照語系別來自動選擇指定的ResourceKey值。
   7: string tLMessage = this.GetLocalResourceObject("Message").ToString();

因為Asp.net Page物件支援System.Web.Compilation.ResourceExpressionFields.ClassKey/ResourceKey,

分別提供GetGlobalResourceObject()可以存取應用程式層級的資源檔,而GetLocalResourceObject則是存

頁面層級的資源檔。這樣的作法方便於在網頁程式中運作,如果您今天打算在另外自訂的非網頁程式類

別中想要取得該方法,則可以參考第2個作法。

 

(2):自訂取得資源

這個方式是為讓程式人員如果自訂一個Class或是想要操作.resx裡的資料時,發現沒有方法一的用法時,

省去重新從宣告一個Page物件使用的方式,另外也可以證實可以直接操作.resx裡的資料。通常在自訂這

個作法時,也許您會在網路上看到如下的範例程式:

   1: // using所需要使用到的參考資源
   2: using System.Reflection;
   3: using System.Resources;
   4: using System.Globalization;
   5:  
   6: // 宣告一個ResourceManager來直接讀取資源檔
   7: System.Resources.ResourceManager tRManager;
   8:  
   9: // 指定要讀取資源檔在Assembly中的類別與要讀取的Assembly
  10: trmanager = new system.resources.resourcemanager("webapplication1.app_globalresources.strings", assembly.getexecutingassembly());
  11:  
  12: string tresult = trmanager.getstring("message");

透過ResourceManager要操作資源檔的概念,其實是這樣的:當我們在網頁程式中,使用了GlobalResource

或LocalResource資料夾,裡面放了很多的資源檔,這些資源夾在編譯過程時會被放進一個叫GlobalResource.dll

的Assembly裡,如果要操作該其中的資源檔,就必需重新指定ResouceManager去擷取Assembly與指定要操作資

源檔的BaseName,這樣才有辦法操作它的內容。

但是,這樣的操作方法,其實是對效能來講是不太好的,而且網頁程式最後被發佈出時,也許又與目前的Assembly

不同,所以直接指定這樣的操作方法是比較不適當的。因此,下方則介紹另一個方法:

‧HttpContext

根據msdn上的描述:「封裝所有關於個別 HTTP 要求的 HTTP 特定資訊。繼承 IHttpModule 和 IHttpHandler

介面的類別具備對目前 HTTP 要求的 HttpContext 物件的參考。物件針對要求提供內建的 Request、Response

Server 屬性的存取。」,看到關鍵字了嗎?「Server屬性的存取」,表現HttpContext也支援操作Server站

台裡的資源,因此,它也有相對提供二個方法:GetGlobalResourceObject與GetLocalResourceObject。

   1: using System.Web;
   2:  
   3: // 使用HttpContext存取資源檔中的ResourceKey也一樣具有與在網頁程式中相同的效果。
   4: string tResult = HttpContext.GetGlobalResourceObject("strings", "Message").ToString();

透過上列的程式碼,你就可以將該段程式撰寫於獨立於網頁程式外的類別檔之中,讓您也可以操作其資源內容。

 

以上是介紹關於.resx資源檔的操作內容,這篇文章只要是自己在做多國語系的時候所遇到的問題,

因此分享給大家,希望對大家有所幫助。

 

[補充]

補充一下透過JavaScript也可以做到取得.resx檔的範例。

 

References:

http://msdn.microsoft.com/zh-tw/library/cc438242(VS.71).aspx

http://www.dotblogs.com.tw/kim/archive/2009/04/30/app_localresources.aspx

http://msdn.microsoft.com/en-us/library/c6zyy3s9(v=VS.100).aspx

http://msdn.microsoft.com/zh-tw/library/system.resources.resourcemanager(v=VS.100).aspx

http://msdn.microsoft.com/zh-tw/library/ms227427(VS.80).aspx

http://msdn.microsoft.com/zh-tw/library/e22s60h9(VS.80).aspx

http://kkbruce.blogspot.com/2009/10/aspnet.html

http://www.williablog.net/williablog/post/2008/11/20/Accessing-Global-Resource-Files-from-a-Class-Library-in-ASPNET.aspx

ASP.NET 2.0 當地語系化功能:一種當地語系化 Web 應用程式的新方法