【问题标题】:DisplayAttribute: No good for resources in App_GlobalResourcesDisplayAttribute:对 App_GlobalResources 中的资源没有好处
【发布时间】:2011-03-09 11:28:52
【问题描述】:

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

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

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

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

然后我运行 Web 应用程序并收到类似以下的错误:

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

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

这里的问题是,为该文件夹中的 resx 文件生成的资源访问器总是作为内部访问生成,无法更改。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    更新

    这可能有效:Making global resources public

    【讨论】:

    • 别介意我的回答。我刚刚注意到下拉菜单仅适用于本地资源,而不是全局资源。我很抱歉。
    • 哦,是的,当然。我不知道他们为什么强迫全球资源在内部。
    • +1 & answer - 我最后没有这样做,我只是回到了我自己的属性,它起作用了。但是,如果绝对需要使用 DisplayAttribute,这可能是最简单的方法。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以选择生成为 public 参见more details here

      【讨论】:

      • 不,你不能——你可以对编译为嵌入式资源的“普通”resx文件执行此操作;但您不能在 Asp.Net App_GlobalResource 资源文件上执行此操作。由于一些非常奇怪的原因,它们被固定在内部,您也无法更改它们被编译到的命名空间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2010-11-11
      • 2011-11-28
      • 2019-06-09
      相关资源
      最近更新 更多