SiteMap изменить SiteMapProvider?
У меня есть пользовательская навигация по меню, созданная из файла web.sitemap, первая строка которого будет выглядеть примерно так:
SiteMapNodeCollection topLevelNodes = SiteMap.RootNode.ChildNodes;
Это работает - он получает все узлы верхнего уровня из файла web.sitemap и позволяет мне просматривать каждый SiteMapNode и делать вещи.
Однако теперь я хочу иметь возможность создавать несколько файлов web.sitemap, а затем программно определять, какой файл web.sitemap использовать, но я не могу понять, как это сделать. Я предполагаю, что я мог бы либо создать один пользовательский SiteMapProvider, который может выполнять логику, чтобы определить, какой файл web.sitemap загружать, либо у меня есть несколько провайдеров, каждый из которых со свойством SiteMapFile, установленным в определенный файл *.sitemap, и затем переключиться провайдеры программно, прежде чем я получу доступ к SiteMap.RootNode.
Я думаю, что, вероятно, проще иметь одного собственного провайдера, а затем переопределить часть, где он ищет фактическое физическое расположение файла карты сайта, но мне неясно, как бы я это сделал
Я много гуглил, но большинство ответов, похоже, касаются стандартных элементов управления sitemappath и так далее, а также того, как установить SiteMapDataSource, что я не думаю, имеет отношение к моему подходу.
2 ответа
Комментарий Паули был ответом на мое конкретное требование:
"Вы не должны ничего переключать / менять... вместо этого вам нужно постоянно получать доступ к RootNode, как это
SiteMap.Providers[someProvider].RootNode
и someProvider должен быть разрешен во время выполнения. "
Я не осознавал, что это возможно, но было правильным решением для меня.
Сначала вам нужно указать все ваши файлы Sitemap в вашем файле 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";