Файл ресурсов для MVCsiteMapProvider

Я использую MVCsiteMapProvider для создания меню с локализацией для своего приложения. Моя программа работает нормально, пока файлы ресурсов для меню находятся в папке App_GlobalResources. Когда я перемещаю ресурсы в другую папку, выдает ошибку, что ресурсы не найдены. Я использую $resources:Resource,menu_Home для доступа к ресурсам в файле MVC.sitemap. Я хочу хранить файлы ресурсов в пользовательской папке, не сохраняя их в папке App_GlobalResources. Кто-нибудь может помочь?


person SDK    schedule 02.07.2012    source источник
comment
Я не думаю, что это можно сделать, так как это делается с помощью функции локализации по умолчанию, встроенной в XmlSiteMapProvider в .NET framework, см. msdn.microsoft.com/en-us/library/ms178427(v=vs.100).aspx. Но если это можно изменить, это сработает.   -  person Xharze    schedule 02.07.2012
comment
Я искал везде... Похоже на то. :-/   -  person SDK    schedule 02.07.2012
comment
У меня та же проблема. Я не могу понять, почему это не было обходным путем, поскольку ресурсы в приложениях MVC лучше размещать в другом месте, а в App_GlobalResources, для целей тестирования.   -  person Jaime    schedule 20.11.2013


Ответы (1)


это происходит из-за следующего кода в свойстве MvcSiteMapNode.Title:

var implicitResourceString = GetImplicitResourceString("title");
if (implicitResourceString != null && implicitResourceString == this["title"])
{
    return implicitResourceString;
}
implicitResourceString = GetExplicitResourceString("title", this["title"], true);
if (implicitResourceString != null && implicitResourceString == this["title"])
{
    return implicitResourceString;
}

В методе GetExplicitResourceString() последний параметр равен true, что означает throwIfNotFound. Вот почему выбрасывается исключение. Я исправил это, заменив приведенный выше код следующим кодом:

if (!string.IsNullOrEmpty(title))
{
    if (Provider.EnableLocalization)
    {
        try
        {
            if (!string.IsNullOrEmpty(title) && title.Contains("."))
            {
                int idx = title.LastIndexOf(",");
                string res = title.Substring(0, idx);
                string assembly = title.Substring(idx + 1);

                idx = res.LastIndexOf(".");
                string type = res.Substring(0, idx);
                string key = res.Substring(idx + 1);
                var rm = new ResourceManager(type, Assembly.Load(assembly));
                return rm.GetString(key);
            }
        }
        catch
        {
        }
        return title;
    }
}

И внутри файла .sitemap вместо синтаксиса title="$resources:Resource,Key" используйте синтаксис title="Namespace.Class.Property,Assembly", который больше подходит при использовании встроенных ресурсов с сгенерированным классом строгого типа.

person alex    schedule 02.04.2014