Подпапки в App_GlobalResources (ASP.NET) - PullRequest
7 голосов
/ 30 марта 2010

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

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

Ответы [ 2 ]

12 голосов
/ 03 апреля 2010

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

1 голос
/ 02 апреля 2010

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

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

}

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

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

...