カスタムXMLSiteMapProviderで情報フォームページを取得する方法
-
05-07-2019 - |
質問
まず、このプロジェクトで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;
}
}