2011-03-09 26 views
6

這個問題實際上適用於所有項目,但是我的演示環境是MVC3應用程序,因此該標記。DisplayAttribute:對App_GlobalResources中的資源沒有好處

我爲我們的MVC2項目編寫了一個DisplayNameAttribute派生類,就像很多人一樣,所以我可以在MVC編輯器和顯示模板中本地化顯示名稱。我解除了用於錯誤消息的ValidationAttribute本地化代碼,以便它以「標準」方式運行。

然後,我注意到,在MVC3我們有DisplayAttribute,所以我盡職盡責地廢棄我的屬性類在.NET 4的版本我的MVC擴展框架,並以我目前的項目中使用此,例如改變了模特屬性:

[Display(ResourceType = typeof(Resources.MyResources), Name = "ResourceName")] 
public string ModelProperty { get; set; } 

然後我運行Web應用程序,我得到類似這樣的錯誤:

System.InvalidOperationException:因本地化失敗無法檢索屬性「名稱」。類型'[資源類型在這裏]'不是公共的,或者不包含名稱爲'[Resource Name here]'的公共靜態字符串屬性。

我當然在各個地方使用本地化,而在類庫中這些資源通常會被標記爲公開。但是,在Web應用程序中,我將使用App_GlobalResources文件夾,因爲,就是這樣!

的這裏的問題是,作爲此文件夾中的文件RESX生成的資源訪問器是作爲內部訪問所產生總是,沒有辦法改變它的。

所以,既然DisplayAttribute似乎只是爲了尋求公衆成員(而本地化的代碼,我從ValidationAttribute複製並應用到自己的DisplayNameAttribute - 導出類型簡單地查找與公共或內部的知名度靜態成員),它會出現DisplayAttribute是否打算對本地化字符串使用App_GlobalResources的任何MVC網絡應用程序禁用?

除了這個事實,這是大概DisplayAttribute的一個錯誤,有其他人遇到這個問題嗎?你做了什麼來解決它?我是否應該尊重DisplayAttribute的使用,並將所有資源更改爲「正確」嵌入到類庫項目中,並將它們全部設置爲公共?或者我應該拋棄DisplayAttribute而轉向我認識的其他課程!?

回答

9

您應該可以更改訪問修飾符。在解決方案資源管理器中,雙擊您的.resx文件,然後在託管資源編輯器的右上角,將 訪問修飾符下拉框從 Internal更改爲 Public

更新

這可能會實現:Making global resources public

+0

不知道我的答案。我只注意到只能爲本地資源啓用下拉菜單,而不是全局菜單。我很抱歉。 – 2011-03-09 15:41:48

+0

嗯...是的,我看到了 - 它的工作原理,但它有點黑客! – 2011-03-09 17:20:33

+0

哦,是的,絕對。我不知道爲什麼他們強調全球資源是內部的。 – 2011-03-09 18:21:21

0

您可以選擇生成的公共看到more details here

+0

不,你不能 - 你可以在編譯爲嵌入資源的'普通'resx文件上做到這一點;但是你不能在Asp.Net App_GlobalResource資源文件上執行此操作。由於一些非常奇怪的原因,它們被固定在內部,而且你也不能改變它們被編譯到的命名空間。 – 2011-03-12 22:57:39

3

This post介紹一點有關問題與使用App_GlobalResources文件或App_LocalResources文件中MVC應用程序。

似乎沒有理由在MVC應用程序中使用App_GlobalResources或App_Localresources,最好不要使用它們來避免出現像您遇到的問題。 (根據之前的鏈接,你可能遇到的另一個問題是單元測試失敗,這是因爲資源只有在ASP.NET運行時運行你的網站時纔可用)

相關問題