質問

まず、このプロジェクトでURL書き換えを使用していることをお知らせする必要があります。

記事ページのURLはwww.mysite.com/section1/section2/month/day/year/modifiedArticleName

です。

ブレッドクラムの場合、すべての記事をxmlファイルに保持できないため、カスタムXMLSiteMapProviderでSiteMapPathコントロールを使用します。このプロバイダーのCurrentNodeプロパティで、URLが記事の1つである場合、新しいSiteMapNodeを作成し、適切な親にリンクして返します。

問題は、そのノードに記事名を提供する必要があることです。上記のように、URLは変更された記事名を使用しているため、URLから取得できません。そのため、ページから取得する必要があります。

CurrentNodeプロパティでは、現在実行中のページのインスタンスを取得できますが、Page_Loadに記事が読み込まれているため、まだタイトルがありません。

ソリューションについて考えましたが、その実装方法が正確にわかりません。そのため、デフォルトとカスタムの2つのXMLSiteMapProviderが必要です。また、カスタムページは記事ページでのみ使用し、記事の詳細を読み込んだ後にのみ初期化します。誰かが私を正しい方向に向けることができますか?

乾杯。

役に立ちましたか?

解決

これを行うことで目標を達成できました。

web.configファイル内:

<siteMap defaultProvider="RegularXMLSiteMapProvider">
  <providers>
    <add name="RegularXMLSiteMapProvider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/Web.sitemap" />
    <add name="EnhancedXMLSiteMapProvider" type="MyApp.App_Code.EnhancedXMLSiteMapProvider, MyApp" siteMapFile="~/Web.sitemap"/>
  </providers>
</siteMap>

通常のページにいるときは常に、デフォルトのプロバイダーを使用します。私が記事ページにいるとき、私はこれをします:

protected void Page_Load(object sender, EventArgs e)
    {
        LoadArticle();

        MasterPages.MyMasterPage myMaster = (MasterPages. MyMasterPage)this.Master;
        myMaster.MySiteMapPath.SiteMapProvider = "EnhancedXMLSiteMapProvider"; 
    }

そして最後に、プロバイダーのCurrentNodeプロパティで記事のタイトルを取得します:

MyApp.ArticlePage page = (MyApp.ArticlePage)HttpContext.Current.Handler;
                    if (page != null)
                    {
                        if (!string.IsNullOrEmpty(page.Article.Title))
                        {
                            articleName = page.Article.Title;
                        }
                    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top