3

我有一个从 web.sitemap 文件构建的自定义菜单导航,第一行类似于:

SiteMapNodeCollection topLevelNodes = SiteMap.RootNode.ChildNodes;

这行得通 - 它从 web.sitemap 文件中获取所有顶级节点,并允许我查看每个 SiteMapNode 并做一些事情。

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

我认为拥有一个自定义提供程序可能更容易,然后覆盖它查找实际物理站点地图文件位置的部分,但我不清楚我将如何做到这一点

我搜索了很多,但大多数答案似乎是关于标准站点地图路径控件等,以及如何设置 SiteMapDataSource,我认为这与我的方法无关。

4

2 回答 2

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";
于 2011-01-25T19:57:34.660 回答
3

Pauli 的评论是对我的特殊要求的回答:

“你不应该切换/改变任何东西......相反,你需要一直像这样访问 RootNode SiteMap.Providers[someProvider].RootNode,然后应该在运行时解析 someProvider。”

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

于 2011-01-27T10:15:23.273 回答