2011-12-20 8 views
0

私のサイトは、データベースとXMLデータの両方からサイトマップを動的に作成しています。しかし、ニュース記事をリストアップしているサイトの一部については、ニュース記事の詳細ページをサイトマップに入れないことに決めました。したがって、ニュース記事のタイトル(サイトマップにあるリスティングページから)をクリックすると、記事のあるページに移動しますが、そのページ/ URLはサイトマップにありません。別の既存のSiteMapNodeを使用するためにSiteMap.CurrentNodeを偽装する

私は、ページの読み込みに私がサイトマップにあるニュース記事のリストページ(のノードにSiteMap.CurrentNodeを変更したい、基本的に

SiteMap.CurrentNode 

を使用するマスターページのコントロールとロジックを持っています)。したがって、本質的にこのページで実行されているロジックのすべてが、そのページをリスティングページであるかのように扱います。私はこれを行うためにとにかく見つけることができません。

このコードは、私がその鍵を知っているので、私が望むノードを得ることができます。

SiteMapDataSource siteMapDataSource1 = new SiteMapDataSource(); 
    siteMapDataSource1.SiteMapProvider = "Main"; 
    SiteMapNode newsListingPageNode = siteMapDataSource1.Provider.FindSiteMapNodeFromKey(siteMapKey); 

だから、基本的に私はこれを行うことがしたい:

SiteMap.CurrentNode = newsListingPageNode; 

しかし、現ノードを設定することはできません。

どのように私はこれを行うことができますか?私は助けに感謝します。

答えて

2

this articleによれば、SiteMapResolveイベント用のカスタムハンドラを作成することができ、おそらくカスタムノードをそこから返すことができます。

+0

Chrisさん、ありがとうございました。私はこれが間違いなくほとんどの場合有効だと思います。残念ながら、適切な(おそらくおそらく最良ではない)解決策が出てくるまで、私はあなたの回答を見ませんでした。私は通知の設定を変更する必要があります...私はこれを試すことができるだけでなく、いくつかの将来のプロジェクトは、おそらくこのサイトマップアーキテクチャと同じサイトマップアーキテクチャを使用し、そのようなソリューションを使用する必要があります。 – Dmase05

0

ここで私が思いついた解決策はありますが、私の好みには少し複雑すぎます。現在表示されているページがサイトマップ内になく、ナビゲーション、コントロール、その他のロジックがサイトマッププロバイダを使用する予定であることを覚えておいてください。ページがサイトマップにないので、サイトマッププロバイダは利用できないため、サイトマップと現在のノードを手動で設定する必要があります。サイトマップの全体的なサイズを大幅に増やすので、サイトマップにニュースページを持たないことを選択します。

まず、SiteMap.CurrentNodeプロパティではなく、ダイナミックサイトマッププロバイダのカスタムThisNodeプロパティを使用します。ニュースの詳細ページ(/news-and-events-detail.aspx)私は動的なプロバイダで作成ユーティリティメソッド呼び出しで

 public static SiteMapNode ThisNode 
    { 
     get 
     { 
      if (_thisNode == null) 
      { 
       if (SiteMap.CurrentNode != null) 
       { 
        return SiteMap.CurrentNode; 
       } 
       else 
       { 
        return null; 
       } 
      } 
      else 
      { 
       return _thisNode; 
      } 
     } 
     set 
     { 
      _thisNode = value; 
     } 
    } 

// Set the ThisNode property to the /news-and-events-list.aspx node. 
    // This will allow all sitemap driven controls and logic (such as navs, info bar, and dynamic links) to function since these detail pages are not in the sitemap. 
    DynamicSiteMapProviders.SetThisNodeToAlternateNode("/news-and-events-list.aspx"); 

これは、ユーティリティメソッドです:

/// <summary> 
    /// Sets the DynamicSiteMapProviders.ThisNode property to the node of specified URL. 
    /// </summary> 
    /// <param name="urlOfNodeToSetTo">The URL of the node to set from.</param> 
    public static void SetThisNodeToAlternateNode(string urlOfNodeToSetTo) 
    { 
     SiteMapDataSource siteMapDataSource = new SiteMapDataSource(); 
     siteMapDataSource.SiteMapProvider = "Main"; 
     DynamicSiteMapProviders.ThisNode = siteMapDataSource.Provider.FindSiteMapNode(urlOfNodeToSetTo); 
    } 

今すぐベースマスターページに、私はその静的以来DynamicSiteMapProviders.ThisNodeプロパティをリセットする必要があり、私は、次のページを望んでいない私が訪問手動で設定されたノードを使用します。ページのライフサイクルのOnUnload()イベントを利用してロジックとレンダリングを実行しているページが完了したら、これを行います。上のThisNodeプロパティのGet/Setのロジックを見てください。

// This ensures that DynamicSiteMapProviders.ThisNode is not set to the node of a previously viewed page. 
// This is mainly for news and events pages that are not in the sitemap and are using the news and events listing page node as the current node. 
protected override void OnUnload(EventArgs e) 
{ 
    DynamicSiteMapProviders.ThisNode = null; 
    base.OnUnload(e); 
} 
関連する問題