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