本质上,问题是我无法让我的站点地图配置支持多个站点地图。即使我命名我的实例并请求另一个,它也总是在寻找“默认”。现在为背景。
我一直在为 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”,因为它总是显示“默认”或者如果它不存在就会抱怨。
我还认为它可能与缓存有关,因为我看到那里引用了文件名,但我不知道如何将多个实例添加到缓存中,所以我只是禁用了它。无论如何,我真的没有对我的站点地图做任何花哨的事情,而这整件事真的感觉像是为了获得一些翻转的自动面包屑而过度杀伤力!