我有一个从web.sitemap文件构建的自定义菜单导航,它的第一行应该是这样的:
SiteMapNodeCollection topLevelNodes = SiteMap.RootNode.ChildNodes;
这是可行的-它从web.sitemap文件中获取所有顶级节点,并允许我查看每个SiteMapNode并执行某些操作。
但是,现在我希望能够创建多个web.sitemap文件,然后以编程方式确定要使用哪个web.sitemap文件,但我似乎找不到如何做到这一点。我假设我可以创建一个自定义SiteMapProvider来执行逻辑以确定要加载哪个web.sitemap文件,也可以创建多个提供程序,每个提供程序都将SiteMapFile属性设置为一个特定的*.sitemap文件,然后在访问SiteMap.RootNode之前以编程方式切换提供程序。
我认为有一个自定义的提供者,然后覆盖它查找实际物理站点地图文件位置的部分可能会更容易,但我不知道如何做到这一点
我用谷歌搜索了很多,但大多数答案似乎都是关于标准的sitemappath控件等等,以及如何设置SiteMapDataSource,我认为这与我的方法无关。
发布于 2011-01-26 03:57:35
首先,您需要指定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-27 18:15:23
保利的评论是对我特殊要求的回答:
“你不应该切换/改变任何东西……相反,你需要像这样一直访问RootNode,
SiteMap.Providers[someProvider].RootNode
,然后someProvider应该在运行时被解析。”
我没有意识到这是可能的,但对我来说是正确的解决方案。
https://stackoverflow.com/questions/4797572
复制相似问题