0

私のサイトは、データベースと xml データの両方からサイトマップを動的に作成しています。これはうまく機能していますが、ニュース記事を一覧表示するサイトの一部については、ニュース記事の詳細ページをサイト マップに配置しないことにしました。そのため、ニュース記事のタイトル (サイトマップにある一覧ページから) をクリックすると、記事のあるページに移動しますが、そのページ/URL はサイトマップにありません。

を使用するマスター ページにコントロールとロジックがあります。

SiteMap.CurrentNode

基本的に、ページの読み込み時に、SiteMap.CurrentNode をニュース記事一覧ページ (サイトマップ内) のノードに変更したいと考えています。したがって、基本的に、このページで実行されているすべてのロジックは、このページをリスト ページであるかのように扱います。とにかくこれを行う方法が見つかりません。

このコードは、キーを知っているので、必要なノードを取得します。

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

だから基本的に私はこれを行うことができればいいのに:

SiteMap.CurrentNode = newsListingPageNode;

ただし、CurrentNode は設定できません。

これを行う方法について何か提案はありますか? 助けてくれてありがとう。

4

2 に答える 2

2

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

于 2011-12-21T13:34:09.487 に答える
0

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

まず、SiteMap.CurrentNodeプロパティではなく、動的サイトマッププロバイダーのカスタムThisNodeプロパティを使用します。

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

ニュースの詳細ページ(/news-and-events-detail.aspx)で、動的プロバイダーで作成されたユーティリティメソッドを呼び出します。

    // 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);
}
于 2012-01-30T14:40:35.093 に答える