ASP.NET:SiteMapPathパスメカニズムの拡張

ASP.NETで開発する場合、標準タスクに標準コンポーネントを使用することに慣れています。 これらの標準タスクの1つは、メインページからサイトへのパスをサイトの各ページに表示することです-サイトマップパスのフラグメント。 これを行うには、SiteMapPathコントロールを使用します。これは、デフォルトでサイトマッププロバイダー(SiteMapProvider)からサイトマップ上のデータを取得し、Web.siteMap構成ファイルから取得します。



このコントロールをサイトのマスターページに配置し、構成ファイルにサイトマップを記述することにより、すべてのページのパスが表示されるようにします。



ただし、ASP.NETは拡張可能な環境であり、ほぼすべての標準モジュールを置き換えることができ、サイトマッププロバイダーも例外ではありません。 サイトマップの高度な機能を取得するために、独自のプロバイダーを作成する方法を検討します。





サイト上のユーザーの現在の位置をページに表示する標準コンポーネントSiteMapPathは、ユーザーが表示するリンクがweb.sitemap構成ファイルから取得した静的テキストであるという事実によって制限されます。 したがって、パスを使用してページに「アルバム>>アルバムを表示>>写真を表示」というパスを表示できますが、動的なデータを代わりに使用できます。たとえば、「アルバム>> Crimea 2007への旅>> Vovaが桟橋からジャンプします」は使用できなくなりました。



一般に、「彼らの言うこと」を表示する独自の同様のコントロールを書くことは長いことではありませんが、それを標準のSiteMapPathにすることは興味深いです。



これを行うには、SiteMapProviderクラスの独自のバージョンを実装する必要があります。



問題を引き起こすために、サイトマップファイルのフラグメントの典型的な例を考えてみましょう。



サイトマップ1



このようなサイトマップがあると、iPhoneの説明ページに「カタログ>>製品の説明」というパスが表示されます。 しかし、「カタログ>> iPhoneの説明」のように見えたらもっと面白いでしょう。 直観的に、これはある種のsiteMapの存在を示唆しています。



サイトマップ2



しかし、商品の説明にさらに論理的にネストされたページがあり、たとえば「カタログ>> iPhoneの説明>>写真」があると想像した場合、ユーザーは「写真」セクションに移動して「iPhoneの説明」をクリックして戻ることができます前のページ。 「iPhoneの説明」リンクの正確さも必要であることが明らかになりました。これは、現時点ではurl =「good.aspx」のように見えます。 特定の製品を示すものではありません。 したがって、URLにいくつかの動的フラグメントを追加する必要があり、結果の「架空の」siteMapは次のようになります。



サイトマップ決勝



したがって、タスクは次のようになります。上記の拡張siteMap構文をサポートするSiteMapProviderを記述して、動的コンテンツをSiteMapPathに出力します



もう1つの興味深い質問は、この非常に文脈的な動的情報をどこから取得するかです。 私の仕事の現実では、ページには通常、表示するビジネスオブジェクトを表すプロパティがあります。 たとえば、Good.aspxページには、表示されるProductオブジェクトを表すGoodタイプのGoodプロパティがあります。 したがって、メタ置換フラグメント([$ ... $])の内容をプロパティパスとして解釈すると、Good.IDおよびGood.Nameの形式の式が、現在のページのGoodプロパティを通じて表されるビジネスエンティティのIDおよびNameプロパティへのアクセスに便利です(good .aspx)。



あなたの場合、他のソースまたは他の方法からこのデータを取得するのが便利かもしれません-これは実装が簡単で、メタ置換は開発されたクラスのコードで十分にローカライズされます。



プロバイダーを実装するには、標準のSiteMapProviderから継承し、多くのプロパティとメソッドをオーバーライドすると便利です。 読者に技術的な詳細を説明するために、結果のクラスのコードを添付ファイルで提供します。




プロバイダーコードファイル: DynamicXmlSiteMapProvider.cs

誰かが役に立つといいのですが:-)




Gendix Cross-Post




All Articles