Проблема, по сути, в том, что я не могу заставить свою конфигурацию карты сайта поддерживать несколько карт сайта. Он всегда ищет «по умолчанию», даже когда я называю свои экземпляры и запрашиваю другой. Теперь о фоне.
Я изучил документы для новой реализации MVCsiteMapProvider. Теперь они используют внедрение зависимостей для настройки SiteMapProvider. У нас есть существующая реализация StructureMap DI, поэтому я следовал инструкциям и добавил, в нашем случае
ObjectFactory.Configure(x =>
{
...
x.AddRegistry<MvcSiteMapProviderRegistry>();
...
});
Затем я начал настраивать файл MvcSiteMapProviderRegistry.cs, чтобы реализовать мой сценарий с несколькими картами сайта. У меня есть несколько файлов карты сайта, любой из них будет работать, если он называется «по умолчанию». Если я удаляю элемент «по умолчанию», он ломается и жалуется, что «по умолчанию» отсутствует. Я предполагаю, что это потому, что он не может найти мой экземпляр. Вот как я их определил. Я подозреваю, что проблема где-то здесь... загрузчик, который, как он говорит, я должен настроить в Global.asax, ищет ISiteMapLoader, но я добавляю свою множественную конфигурацию в SiteMapBuilderSet... в любом случае, вот код.
// Register the sitemap builder
string absoluteFileName = HostingEnvironment.MapPath("~/Main.sitemap");
string absoluteFileName2 = HostingEnvironment.MapPath("~/Test.sitemap");
var xmlSource = this.For<IXmlSource>().Use<FileXmlSource>()
.Ctor<string>("fileName").Is(absoluteFileName);
var reservedAttributeNameProvider = this.For<ISiteMapXmlReservedAttributeNameProvider>()
.Use<SiteMapXmlReservedAttributeNameProvider>()
.Ctor<IEnumerable<string>>("attributesToIgnore").Is(new string[0]);
var builder = this.For<ISiteMapBuilder>().Use<CompositeSiteMapBuilder>()
.EnumerableOf<ISiteMapBuilder>().Contains(y =>
{
y.Type<XmlSiteMapBuilder>()
.Ctor<ISiteMapXmlReservedAttributeNameProvider>().Is(reservedAttributeNameProvider)
.Ctor<IXmlSource>().Is(xmlSource);
y.Type<ReflectionSiteMapBuilder>()
.Ctor<IEnumerable<string>>("includeAssemblies").Is(includeAssembliesForScan)
.Ctor<IEnumerable<string>>("excludeAssemblies").Is(new string[0]);
y.Type<VisitingSiteMapBuilder>();
});
var xmlSource2 = this.For<IXmlSource>().Use<FileXmlSource>()
.Ctor<string>("fileName").Is(absoluteFileName2);
var builder2 = this.For<ISiteMapBuilder>().Use<CompositeSiteMapBuilder>()
.EnumerableOf<ISiteMapBuilder>().Contains(y =>
{
y.Type<XmlSiteMapBuilder>()
.Ctor<ISiteMapXmlReservedAttributeNameProvider>().Is(reservedAttributeNameProvider)
.Ctor<IXmlSource>().Is(xmlSource2);
y.Type<ReflectionSiteMapBuilder>()
.Ctor<IEnumerable<string>>("includeAssemblies").Is(includeAssembliesForScan)
.Ctor<IEnumerable<string>>("excludeAssemblies").Is(new string[0]);
y.Type<VisitingSiteMapBuilder>();
});
// Configure the builder sets
this.For<ISiteMapBuilderSetStrategy>().Use<SiteMapBuilderSetStrategy>()
.EnumerableOf<ISiteMapBuilderSet>().Contains(x =>
{
/* x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is("default")
.Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
.Ctor<bool>("enableLocalization").Is(enableLocalization)
.Ctor<ISiteMapBuilder>().Is(builder)
.Ctor<ICacheDetails>().Is(cacheDetails);*/
/*
x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is("MainSiteMapProvider")
.Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
.Ctor<bool>("enableLocalization").Is(enableLocalization)
.Ctor<ISiteMapBuilder>().Is(builder)
.Ctor<ICacheDetails>().Is(cacheDetails);*/
x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is("TestSiteMapProvider")
.Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
.Ctor<bool>("enableLocalization").Is(enableLocalization)
.Ctor<ISiteMapBuilder>().Is(builder2)
.Ctor<ICacheDetails>().Is(cacheDetails);
});
В моем global.asax.cs я добавил
MvcSiteMapProvider.SiteMaps.Loader = Resolver.Get<ISiteMapLoader>();
и для ссылки на мой взгляд у меня есть
@Html.MvcSiteMap("TestSiteMapProvider").Menu(false, true, true)
но он не должен быть в состоянии найти «TestSiteMapProvider», потому что он всегда отображает «по умолчанию» или жалуется, если он не существует.
Я также подумал, что это может быть как-то связано с кешем, так как я вижу там указанное имя файла, но я не знаю, как добавить несколько экземпляров в кеш, поэтому я просто отключил его. В любом случае, я действительно не делаю ничего необычного со своими картами сайта, и все это действительно похоже на огромное излишество, просто чтобы получить несколько автоматических хлебных крошек!