SiteMap изменить SiteMapProvider? - PullRequest
3 голосов
/ 25 января 2011

У меня есть пользовательское меню, построенное из файла web.sitemap, первая строка которого будет выглядеть примерно так:

SiteMapNodeCollection topLevelNodes = SiteMap.RootNode.ChildNodes;

Это работает - он получает все узлы верхнего уровня изфайл web.sitemap, и позволяет мне просматривать каждый SiteMapNode и делать вещи.

Однако теперь я хочу иметь возможность создавать несколько файлов web.sitemap, а затем программно определять, какой файл web.sitemap использовать, но я не могу понять, как это сделать.Я предполагаю, что я мог бы либо создать один пользовательский SiteMapProvider, который может выполнять логику, чтобы определить, какой файл web.sitemap загрузить, либо у меня есть несколько провайдеров, каждый из которых со свойством SiteMapFile, установленным в определенный файл * .sitemap, и затем переключитьсяпоставщики программно, прежде чем я получу доступ к SiteMap.RootNode.

Я думаю, что, вероятно, проще иметь одного настраиваемого поставщика, а затем переопределить часть, где он ищет фактическое физическое местоположение файла карты сайта, но мне неясно, как бы ясделайте это

Я много гуглил, но большинство ответов, похоже, касаются стандартных элементов управления sitemappath и т. д., а также того, как установить SiteMapDataSource, что я не считаю подходящим для моего подхода.

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Комментарий Паули был ответом на мое конкретное требование:

"Вы не должны ничего переключать / менять ... вместо этого вам нужен доступ RootNode, как это все время SiteMap.Providers[someProvider].RootNode и someProvider должен затем разрешаться во время выполнения. "

Я не осознавал, что это возможно, но для меня было правильным решением.

3 голосов
/ 25 января 2011

Сначала вам нужно указать все файлы 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";
...