“资源”这个名称在当前上下文中不存在

时间:2013-04-07 09:20:34

标签: asp.net asp.net-mvc-4 internationalization

我正在尝试基于this article在我的项目中Internationalisation。但在LanguageController.cs方法的Language文件中:

    public JavaScriptResult Language()
    {
        return GetResourceScript(Resources.Language.ResourceManager); //Error
    }

我收到此错误:

The name 'Resources' does not exist in the current context

什么是错的呢?

5 个答案:

答案 0 :(得分:6)

您应该在应用程序中添加Resources.resx文件。还要注意添加它的文件夹。例如,App_GlobalResources是一个特殊的ASP.NET文件夹,您应该尝试将resx文件放在其他位置。

答案 1 :(得分:4)

有时,当您的活动命名空间与Resource.Designer.cs文件不在同一名称空间中时,或者命名空间与其他活动不同时,会发生这种情况。

答案 2 :(得分:0)

答案 3 :(得分:0)

我知道这已被列为答案,但是当前答案实际上对我没有帮助(因为我已经按照该步骤进行了操作)。以防万一其他人正在搜索并且像我一样没有足够的经验,我不得不为用来解决此问题的每种资源添加一行代码。即

var newName = NameSpace.Properties.Resources.resourceName;

显然,请为您自己的项目相应地替换newName,Namespace和resourceName。使用完之后,我可以引用新变量并将其用于我的项目。我可能迟于5年才回答这个问题,但以防万一其他新手在成功添加新资源后遇到了同样的问题。

答案 4 :(得分:0)

http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx中的旧文章(现已失效):

App_GlobalResources中的Resx文件

在控制器代码中使用App_GlobalResources中的资源文件会破坏单元测试。

.resx文件放在特殊的App_GlobalResources文件夹中时,IDE将使用GlobalResourceProxyGenerator生成强类型的内部类来将资源包装在其中。内部类使MVC项目中的任何代码均可访问资源:

var greeting = Resources.Greeting;

您也可以从视图中使用资源:

@Html.Encode(Resources.Strings.Greeting)

问题在于,全局资源实际上并未嵌入到项目的.dll中。而是由ASP.NET运行时使用内部资源创建一个App_GlobalResources程序集。该程序集由ASP.NET创建的所有视图程序集引用,并由GlobalResourceProxyGenerator生成的强类型包装器显式加载。由于App_GlobalResources程序集在没有ASP.NET编译阶段的情况下不存在,因此在运行单元测试时不可用。试图访问资源的受测试控制器代码将炸弹,但有异常。

请注意,使用上面显示的视图语法时,您还将遇到一些Intellisense问题。我猜这是因为IDE在两个地方(项目程序集)看到了资源包装器,而包装器也进入了ASP.NET在Temporary ASP.NET Files文件夹中创建的App_GlobalResource中,因此感到困惑。 )。

有一种方法可以使resx中的App_GlobalResources个文件起作用,但是在MVC项目(或Web应用程序项目)中,文件夹并不是真正必需的。我认为将resx文件添加到其他位置(甚至是单独的类库)也一样容易,以避免对App_GlobalResources的行为产生任何混淆。

简而言之::避免在MVC中使用App_GlobalResourcesApp_LocalResources(存在其自身的问题)。

特殊资源目录之外的Resx文件

如果将resx文件添加到MVC项目或类库中的任何其他文件夹,则resx会自动设置为嵌入到项目的输出程序集中-这很好。 IDE还为resx分配了ResxCodeFileGenerator的自定义工具以生成强类型包装器-这很好。默认情况下,生成的类是内部类–这很不好。 (通过ASP.NET)为视图创建的程序集将无法使用内部类,因为它位于不同的程序集(在Visual Studio中编译的项目程序集)中。

解决方案

简单的解决方法是确保将自定义工具设置为PublicResXFileCodeGenerator而不是ResXCodeFileGenerator。您可以在文件的属性窗口中执行此操作,也可以在为您提供“访问修饰符”下拉菜单的资源编辑器中进行选择(选项为Internal,Public和No Code Generation –选择Public)。

enter image description here

您还可以在属性窗口中为生成的包装器设置“自定义工具命名空间”。我的建议是对全局资源使用诸如“Resources”之类的约定,对于专用于特定视图的资源使用“Resources.Controller.View”之类的约定。

这种方法意味着您可以在可单元测试的控制器代码和视图中使用资源。语法与上面相同。包装器类中使用的ResouceManager可以根据线程的当前UI区域性设置自动解析要使用的适当资源。

设置UI文化

在Web请求处理过程中有效实施正确的UI文化的最简单方法是使用web.config的全球化部分。

<globalization uiCulture="auto" culture="auto"/>

以上内容将为请求设置当前的UI文化和当前的文化设置。

如果您需要根据用户的喜好或URL参数设置区域性,那么最好的选择是编写自定义HTTP模块或操作过滤器。

具有用于所有语言文件的专用本地化文件夹

如果要将Resources.xx-YY.resx文件放在单独的文件夹(即MyNamespace/Localization)中,请将Custom Tool Namespace设置为MyNamespace,则视图将识别资源文件。

enter image description here

您可能还需要更改Resources.Designer.cs文件:

enter image description here