The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何讓 App_GlobalResources 裡的全域資源檔變成公開類別

在中大型的專案裡,通常會將一整個 Visual Studio 方案 (Solution) 切分為好幾個專案 (Project),在製作多國語系網站時有時也會想把資源檔移到另一個獨立了專案中,如此一來才能方便在日後更新這些多國語系資源設定,不過在 Visual Studio 裡面的 ASP.NET 專案新增資源檔時,其類別的存取等級預設為 internal class,如果直接拖曳到另一個專案就會導致在原本的專案無法存取到這個資源檔的情況,必須進一步設定才行。

如下圖是拖曳資源檔到另一個專案的情況:

我們開啟「屬性」視窗可以發現在這個資源檔的「自訂工具」屬性為 GlobalResourceProxyGenerator

這裡的自訂工具其實是一個「程式碼產生器」的名稱 ( 即 GlobalResourceProxyGenerator ),你只要指定成另一個程式碼產生器的名稱,他就會產生出完全不一樣的程式碼。在修改設定之前我們先看一下他原本產生出來的程式碼為何,如下圖示,其 Resource1 類別被標示為 internal class,因此此資源檔類別並無法讓其他組件使用,也進一步代表著這個類別無法使用在其他專案裡:

這時我們再開啟「屬性」視窗,將「自訂工具」屬性修改為 PublicResXFileCodeGenerator

修改完屬性還不夠,還要重新執行一次「自訂工具」才行,請依照如下圖示操作即可:

修正完之後,主要有兩個地方會發生變化:

  1. 命名空間 ( namespace ) 會被改成專案的預設命名空間外加所在的目錄
  2. 原本的 Resource1 類別會被改成 public class 存取等級

最後還有一個步驟,也是最常被忘記的步驟,那就是必須還要修改該檔案的「建置動作」屬性,調整為「內嵌資源」才算做完所有步驟,否則就算你能編譯,在執行時期還是會出錯!請參考以下圖示設定:

最後分享幾個需叮嚀的觀念:

  • 只要是透過程式碼產生器所產生的程式碼,都不要手動去改動他,否則下次更新範本就會把你修改過的程式碼覆蓋掉。
  • 能透過工具產生的程式碼就不要自己寫,寫越多 Bug 就會越多。

ASP.NET MVC 多國語系開發備註:

  • ASP.NET MVC 2 與 ASP.NET MVC 3 在設定 Model Validation 並套用多國語系資源檔時必須將資源檔類別設為公開類別,而且需設定為「內嵌資源」,否則執行時期會發生以下錯誤:
    • 如果沒修改成「公開」類別,會導致完全抓不到資源檔裡的訊息。
    • 如果沒設定為「內嵌資源」會導致以下錯誤:
      找不到任何適用特定文化特性或中性文化特性的資源。請確定您已在編譯時期正確地將 "MvcApplication9.App_GlobalResources.Resource1.resources" 嵌入或連結至組件 "MvcApplication9" 中,或所有需要的附屬組件均為可載入且已完整簽署。
  • 在 ASP.NET MVC 2 裡,只有 ValidationAttribute 的屬性能套用多國語系資源。
  • 在 ASP.NET MVC 3 裡,由於 .NET 4.0 新增了 DisplayAttribute,所以除了錯誤訊息能套用外,也能透過多國語系資源設定欄位的顯示名稱。

相關連結