3

web.sitemap ファイルから構築されたカスタム メニュー ナビゲーションがあります。この最初の行は次のようになります。

SiteMapNodeCollection topLevelNodes = SiteMap.RootNode.ChildNodes;

これはうまくいきます - web.sitemap ファイルからすべての最上位ノードを取得し、各 SiteMapNode を調べて何かをすることができます。

ただし、複数の web.sitemap ファイルを作成し、使用する web.sitemap ファイルをプログラムで決定できるようにしたいのですが、これを行う方法がわかりません。ロードする web.sitemap ファイルを決定するロジックを実行できるカスタム SiteMapProvider を 1 つ作成するか、複数のプロバイダーを用意して、それぞれの SiteMapFile プロパティを特定の *.sitemap ファイルに設定してから切り替えることができると想定しています。 SiteMap.RootNode にアクセスする前に、プロバイダーをプログラムで変更します。

カスタム プロバイダーを 1 つ用意して、実際の物理的なサイトマップ ファイルの場所を検索する部分をオーバーライドする方がおそらく簡単だと思いますが、これをどのように行うかは不明です

私はたくさんグーグルで検索しましたが、ほとんどの回答は標準のサイトマップパスコントロールなどに関するもので、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 で指定したプロバイダーの 1 つに動的に割り当てることができます。

.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

パウリのコメントは、私の特定の要件に対する答えでした。

「何も切り替えたり変更したりしないでください...代わりに、常にこのように RootNode にアクセスする必要があり SiteMap.Providers[someProvider].RootNode、実行時に someProvider を解決する必要があります。」

これが可能であることに気づいていませんでしたが、私にとっては正しい解決策でした。

于 2011-01-27T10:15:23.273 に答える