Подпапки в App_GlobalResources (ASP.NET)

Действительно ли возможно поместить файлы ресурсов (.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?

Если возможно использовать подпапки, как Вы программно получаете доступ к ресурсам в подпапках?

7
задан frankadelic 30 March 2010 в 00:53
поделиться

2 ответа

Технически да, это возможно, но есть некоторые подводные камни. Во-первых, позвольте мне показать вам пример. Предположим, моя папка 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.

12
ответ дан 6 December 2019 в 19:35
поделиться

Это возможно. По крайней мере, мне это удалось.

На веб-сайте я добавил папку 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);
    }

}

Этот подход работает и в среднем доверии.

Похоже, что папки не имеют никакого значения при доступе к ресурсам из кода.

1
ответ дан 6 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: