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";
Другие вопросы по тегам