ASP.NET HttpContext.GetLocalResourceObject () создает исключение InvalidOperationException - PullRequest
1 голос
/ 08 июня 2010

Допустим, у нас есть такая структура сайта:

App_LocalResources
| - A.aspx.resx
| - B.aspx.resx
A.aspx
B.aspx

Теперь я использую HttpContext.GetLocalResourceObject ("~ / A.aspx", "Key1") в A.aspx.cs , и он отлично работает. Но если я использую HttpContext.GetLocalResourceObject ("~ / A.aspx", "Key1") в B.aspx.cs , выдается исключение:

Класс ресурса для этой страницы не найден. Пожалуйста, проверьте, существует ли файл ресурсов, и попробуйте снова.

Сведения об исключении: System.InvalidOperationException: класс ресурсов для этой страницы не найден. Пожалуйста, проверьте, существует ли файл ресурса, и попробуйте снова.

Как я могу решить эту проблему? Я хочу читать локальные ресурсы с внешней страницы и не хочу сам читать файл .resx. Спасибо: -)

ОБНОВЛЕНИЕ: В моем случае есть несколько файлов "data.xml" (они находятся в разных каталогах и имеют элементы, подобные <key name='Key1' value='value1' />), и их содержимое будет отображаться как HTML.

Но имена ключей в data.xml должны быть локализованы перед рендерингом (разные data.xml содержат разные ключи).

Например, в data.xml есть такой элемент:

<key name='CategoryId' value='3' />

В html-странице результатов я хочу отобразить «Category Id = 3» для культуры en-US и «类别 = 3» для культуры zh-CN и т. Д.

Поэтому я думаю, что могу создать несколько файлов по шаблону "data.xml.??-??.resx" в папке App_LocalResources, а затем использовать HttpContext.GetLocalResource() для каждого файла data.xml для получения имен локализованных ключей. Таким образом, мне не нужно самому читать xml . Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 08 июня 2010

Это не тот способ, которым должны использоваться местные ресурсы. Локальные ресурсы действительны только для страницы или элемента управления. Вы должны использовать глобальные ресурсы в вашем случае.

С MSDN

Глобальные файлы ресурсов

Вы создаете файл глобального ресурса, помещая его в зарезервированную папку App_GlobalResources в корне приложения. Любой файл .resx, находящийся в папке App_GlobalResources, имеет глобальную область действия. Кроме того, ASP.NET создает строго типизированный объект, который предоставляет простой способ программного доступа к глобальным ресурсам.

Файлы локальных ресурсов

Файл локальных ресурсов - это файл, который применяется только к одной странице ASP.NET или пользовательскому элементу управления (файл ASP.NET с расширением имени файла .aspx, .ascx или .master). Вы помещаете файлы локальных ресурсов в папки с зарезервированным именем App_LocalResources. В отличие от корневой папки App_GlobalResources, папки App_LocalResources могут находиться в любой папке приложения. Вы связываете набор файлов ресурсов с определенной веб-страницей, используя имя файла ресурса.

И вам также может быть полезно проверить как программно обращаться к ресурсам

    Button1.Text = 
        GetLocalResourceObject("Button1.Text").ToString();
    Image1.ImageUrl = 
        (String)GetGlobalResourceObject(
        "WebResourcesGlobal", "LogoUrl");
    Image1.Visible = true;
3 голосов
/ 14 июня 2010

Как рекомендует Клаудио Реди, используйте файлы Global Resource.

Я бы создал один файл на xml в формате «filename.resx», так что в вашем примере вы бы назвали его Data.resx.

Установите для «Name» в ресурсе свой атрибут «name» и значение, равное переведенному «name».

Например, в Data.resx у вас будет Name=CategoryId, Value=Category Id. В Data.zh-CN.resx вы получите Name=CategoryId, Value=类别.

Если у вас есть данные в файлах ресурсов, вы, вероятно, захотите создать класс, который включает в себя функциональность поиска и локализации XML в вашем приложении. Примерно так должно работать:

public class Data
{
    private const string fileLocation = "TODO";

    public string Name{ get; set; }
    public string Value{ get; set; }

    private Data()
    {

    }

    public Data( string Name )
    {
        // TODO: Look up the single key from XML
    }

    public string GetLocalizedName( CultureInfo cultureInfo )
    {
        return Resources.Data.ResourceManager.GetString(Name, cultureInfo);
    }

    public static List<Data> LoadData()
    {
        List<Data> dataList = new List<Data>();

       // TODO: Load XML and create a list of Data objects.

        return dataList;
    }
}
0 голосов
/ 13 июля 2011

Попробуйте выполнить следующие действия:

Шаг 1 - Удалите временные файлы вашего веб-сайта из

C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \Временные файлы ASP.NET

Шаг 2. Очистите и перестройте решение.

Шаг 3. Убедитесь, что файл ресурсов в папке App_LocalResources имеет то же имя, что и страница, на которойимеет эту проблему (и App_LocalResources, и страница находятся в одной папке).

Ваше приложение должно быть в порядке.

http://iymbas.blogspot.com

...