3

我有从Web.sitemap文件建立了一个自定义菜单导航,这个第一行会是这样的:SiteMap更改SiteMapProvider?

SiteMapNodeCollection topLevelNodes = SiteMap.RootNode.ChildNodes; 

这工作 - 它获得所有顶层节点从web.sitemap中文件,并允许我浏览每个SiteMapNode并执行一些操作。

但是,现在我想能够创建多个web.sitemap文件,然后以编程方式确定要使用哪个web.sitemap文件,但我似乎无法找到如何执行此操作。我假设我可以创建一个自定义SiteMapProvider,它可以执行逻辑来确定要加载哪个web.sitemap文件,或者我有多个提供者,每个提供者都将SiteMapFile属性设置为特定的* .sitemap文件,然后切换提供程序之前,我访问SiteMap.RootNode。

我想它可能更容易有一个自定义的供应商,然后覆盖在那里寻找实际的物理站点地图文件位置的部件,但我很清楚我会怎么做这

我GOOGLE了很多,但大多数答案似乎是关于标准sitemappath控件等,以及如何设置一个SiteMapDataSource,我认为这与我的方法不相关。

+4

你不应该切换/改变任何东西......相反你需要像这样一直访问RootNode *然后在运行时解析SiteMap.Providers [someProvider] .RootNode *和* someProvider *。 – 2011-01-25 21:44:15

+0

哦,没想到,明天我会试试,听起来好像会奏效。 – 2011-01-25 21:50:13

回答

3

首先,你需要指定你的web.config所有站点地图文件的这样:

<siteMap defaultProvider="FNDSiteMap" enabled="true"> 
    <providers> 
    <add name="FNDSiteMap" type="System.Web.XmlSiteMapProvider" siteMapFile="FND.sitemap" securityTrimmingEnabled="true"/> 
    <add name="STASiteMap" type="System.Web.XmlSiteMapProvider" siteMapFile="STA.sitemap" securityTrimmingEnabled="true"/> 
    <add name="TASiteMap" type="System.Web.XmlSiteMapProvider" siteMapFile="TA.sitemap" securityTrimmingEnabled="true"/> 
    </providers> 
</siteMap> 

然后在你的代码隐藏您可以将您的SiteMapDataSource(这势必将您的菜单)动态地分配给你在你的web.config中指定的供应商之一:

的.aspx

<asp:Menu ID="MenuLevel1" runat="server" Orientation="Horizontal" DataSourceID="SiteMapLevel1" 
    MaximumDynamicDisplayLevels="0" IncludeStyleBlock="false"> 
</asp:Menu>     
<asp:SiteMapDataSource ID="SiteMapLevel1" runat="server" /> 

的.cs

SiteMapLevel1.SiteMapProvider = "TASiteMap"; 
3

圣保利的评论是回答我的特殊要求:

“你不应该转/改变什么......而不是你需要访问 像这一切的时候 SiteMap.Providers[someProvider].RootNode和的根节点某些提供商应该在运行时解决问题 。“

我没有意识到这是可能的,但是对我来说是正确的解决方案。