如何在ASP.NET MVC中使用已编译的全局资源

时间:2009-12-04 18:54:51

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

我想将 App_GlobalResources / Strings.resx 编译到我的程序集中(并最终使用 Strings.es.resx,Strings.fr.resx 等的附属程序集。 )但应用程序发布后会出现以下错误:

  

“无法加载文件或程序集'App_GlobalResources'或其依赖项之一。系统无法找到指定的文件。”

重现步骤:

  1. 创建一个新的ASP.NET MVC项目。
  2. 添加App_GlobalResources文件夹和 Strings.resx 文件。
  3. 将文件的构建操作设置为“嵌入资源”
  4. 将字符串添加到 Strings.resx 并在HomeController.Index()中使用,例如ViewData["Message"] = Strings.MyTest
  5. F5进行调试,工作正常。
  6. 发布到IIS并且(因为 Strings.resx 被排除在发布之外),您将在发布的网站中收到上述错误。
  7. ASP.NET MVC项目可以使用编译到dll中的字符串资源吗?如果是这样,我做错了什么?


    更新:这是我在Reflector中看到的: String Resources

    那么为什么ResourceManager找不到它们呢?默认情况下不应该fallback to the main assembly吗?

2 个答案:

答案 0 :(得分:23)

这是一个很好的起点http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx

我设置了一个项目就像你提到的那样,当我部署到IIS6时得到了完全相同的错误。根据斯科特的建议,将Custom Tool更改为PublicResXFileCodeGenerator并将Custom Tool Namespace更改为Resources即可将其清除。

我也遵循Scott在消除App_GlobalResources方面的领先优势,但我让它工作得很好。这可能是个人偏好的问题。

答案 1 :(得分:0)

可能还有一件事需要了解PublicResXFileCodeGenerator - 它不适用于文件名中有多个点的文件(参见http://social.msdn.microsoft.com/Forums/ru-RU/9412f049-acd8-4a77-b73a-f3810df18376/naming-resources-files-issue-aspnet-mvc-3?forum=dlr)。所以Strings.es.resx,Strings.fr.resx等的代码隐藏仍然是空的。简单的解决方案是重命名文件。