DisplayAttribute:对App_GlobalResources中的资源没有好处

时间:2011-03-09 11:28:52

标签: .net asp.net asp.net-mvc localization

这个问题确实适用于所有项目,但是我的演示环境是一个MVC3应用程序,因此该标记。

我为MVC2项目编写了一个DisplayNameAttribute派生类,就像许多人一样,所以我可以在MVC编辑器和显示模板中本地化显示名称。我解除了用于错误消息的ValidationAttribute本地化代码,使其以“标准”方式运行。

然后我注意到在MVC3中我们有DisplayAttribute,所以我尽职尽责地在我的MVC扩展框架的.Net 4版本中废弃了我的属性类,并改变了当前项目中的模型属性以使用它,例如:

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

然后我运行网络应用程序,我收到类似这样的错误:

  

System.InvalidOperationException:无法检索属性“名称”,因为本地化失败。类型“[此处的资源类型]”不是公共的,或者不包含名称为“[资源名称此处]”的公共静态字符串属性。

我当然在各个地方使用本地化,而在类库中,这些资源通常会被标记为公共。但是,在Web应用程序中,我将使用App_GlobalResources文件夹,因为就是它的用途!

此处的问题是,为此文件夹中的resx文件生成的资源访问器始终生成为内部访问,无法更改。

所以,因为DisplayAttribute似乎只是寻找公共成员(而我从ValidationAttribute复制并应用于我自己的DisplayNameAttribute的本地化代码 - 派生类型只是寻找静态成员公共或内部可见性),DisplayAttribute对于打算使用App_GlobalResources用于本地化字符串的任何MVC网络应用程序似乎是禁止的吗?

除了可能 DisplayAttribute中的错误之外,还有其他人遇到过这个问题吗?你做了什么来解决它?我是否应该尊重DisplayAttribute的使用并将我的所有资源更改为“正确”嵌入在类库项目中,并将它们全部设置为公共?或者我应该放弃DisplayAttribute以支持我认识的其他课程??

3 个答案:

答案 0 :(得分:9)

您应该可以更改访问修饰符。在解决方案资源管理器中,双击.resx文件,然后在托管资源编辑器的右上角附近,将访问修饰符下拉列表从Internal更改为Public

<强>更新

这可能有效:Making global resources public

答案 1 :(得分:3)

This post更多地解释了在MVC应用程序中使用App_GlobalResources或App_Localresources的问题。

似乎没有理由在MVC应用程序中使用App_GlobalResources或App_Localresources,最好不要使用它们来避免像您遇到的那样的问题。 (根据前面的链接,您可能遇到的另一个问题是单元测试失败。这是因为资源仅在ASP.NET运行时运行您的网站时可用)

答案 2 :(得分:0)

您可以选择生成公开,请参阅more details here