7

是否可以将资源文件(.resx)置于App_GlobalResources中的子文件夹中?App_GlobalResources中的子文件夹(ASP.NET)

例如:

/App_GlobalResources/someresources/myfile.resx

/App_GlobalResources/someresources/myfile.fr-fr.resx

/App_GlobalResources/othereresources/otherfile.resx

/App_GlobalResources/othereresources/otherfile.fr-fr.resx

或者,是所有.resx文件直接放在里面App_GlobalResources文件?

如果可以使用子文件夹,您如何以编程方式访问子文件夹内的资源?

回答

12

从技术上讲,是的,这是可能的,但也有一些陷阱。首先,让我给你看一个例子。假设我App_GlobalResources文件夹看起来像这样:

/App_GlobalResources 
    /Test 
     TestSubresource.resx 
    TestResource.resx 

每个资源文件有一个称为“后的TestString”一个条目。我使用Visual Studio菜单添加了每个资源文件,因此它为我创建了一个类。默认情况下,添加到App_GlobalResources文件夹的所有类将具有相同的命名空间Resource。所以,如果我想使用类生成器,并且我想在命名空间中使用Test,那么我需要进入TestSubresource.Designer.cs文件并手动更改命名空间。一旦我这样做,我可以做到以下几点:

var rootResource = Resources.TestResource.TestString; 
var subResource = Resources.Test.TestSubResource.TestString; 

我也可以用GetGlobalResourceObject引用它们:

,我仍然用“TestSubresource”为手段
var rootResource = GetGlobalResourceObject("TestResource", "TestString"); 
var subResource1 = GetGlobalResourceObject("TestSubresource", "TestString"); 

通知引用资源该文件即使在子文件夹中。现在,其中一种捕获方式是,所有文件在App_GlobalResources的所有文件夹中必须是唯一的,否则您的项目将引发运行时错误。如果我添加一个名为“TestResource.resx”到/测试资源,它会引发以下运行时错误:

The resource file '/App_GlobalResources/TestResource.resx' cannot be used, as it conflicts with another file with the same name.).

这是真实的,即使我改变对新资源的命名空间。

因此,总而言之,这是可能的,但是由于文件系统允许的App_GlobalResources文件夹结构的不同部分中有两个名称相同的资源文件,但由于文件系统允许,导致运行时错误的可能性增加。净。

1

这是可能的。至少,我设法做到了。

在一个网站中,我添加了App_GlobalResources文件夹。在里面我创建了另一个文件夹“MyFolder”,并将MyResource.resx文件放入其中。 Resx文件包含一对MyKey1 - MyValue1。

使用下面的类我成功地提取“MyValue1”为名称=“MyKey1”

static class Class1 { 

    static Assembly FindGlobalResAssembly() { 
     foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { 
      if(asm.FullName.StartsWith("App_GlobalResources.")) 
       return asm; 
     } 
     return null; 
    } 

    public static object GetResource(string name) { 
     Assembly asm = FindGlobalResAssembly(); 
     if(asm == null) 
      return null; 
     return new ResourceManager("Resources.MyResource", asm).GetObject(name); 
    } 

} 

这种方法在中等信任也适用的GetResource方法。

从代码访问资源时,似乎文件夹没有任何区别。