Подпапки в App_GlobalResources (ASP.NET)
-
23-09-2019 - |
Вопрос
Можно ли поместить файлы ресурсов (.resx) в подпапки внутри App_GlobalResources?
Например:
/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?
Если можно использовать подпапки, как программно получить доступ к ресурсам внутри подпапок?
Решение
Технически да, это возможно, но есть некоторые подводные камни.Во-первых, позвольте мне показать вам пример.Предположим, мой 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
:
var rootResource = GetGlobalResourceObject( "TestResource", "TestString" );
var subResource1 = GetGlobalResourceObject( "TestSubresource", "TestString" );
Обратите внимание, что я по-прежнему использую «TestSubresource» как средство ссылки на ресурсы в этом файле, даже если он находится во вложенной папке.Теперь одна из загвоздок заключается в том, что все файлы должны быть уникальными во всех папках в App_GlobalResources
или ваш проект выдаст ошибку времени выполнения.Если я добавлю ресурс с именем «TestResource.resx» в /Test, он выдаст следующую ошибку времени выполнения:
Файл ресурса '/App_GlobalResources/Testresource.resx' не может быть использован, поскольку он противоречит другому файлу с тем же именем.).
Это верно, даже если я изменю пространство имен нового ресурса.
Итак, в заключение: да, это возможно, но вы увеличиваете вероятность получения ошибки во время выполнения из-за двух файлов ресурсов с одинаковыми именами в разных частях App_GlobalResources
структура папок, которая разрешена файловой системой, но не .NET.
Другие советы
Возможно.По крайней мере, мне удалось это сделать.
На веб-сайте я добавил папку App_GlobalResources.Внутри него я создал еще одну папку «MyFolder» и поместил внутрь файл MyResource.resx.Файл Resx содержал одну пару MyKey1 — MyValue1.
Используя GetResource
метод следующего класса, я успешно извлек "MyValue1" для name="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);
}
}
Этот подход работает и при среднем доверии.
Кажется, что папки не имеют никакого значения при доступе к ресурсам из кода.