1. はじめに
複数のページで構成される Web サイトには、2 つのステップで作成される、ある種のナビゲーション ユーザー インターフェイスが必要です。まず、サイトの論理構造を定義する必要があります。次に、ユーザーがサイト構造のさまざまな部分の間を行き来できるようにするためのユーザー インターフェイス要素を追加します。 ASP.NET 2.0 が登場する前は、開発者はこれら 2 つの問題を自分で解決する必要がありました。ただし、バージョン 2.0 の時点では、ASP.NET はサイトの構造を定義する簡単な方法を提供し、サイト ナビゲーション ユーザー インターフェイスを表示するために特別に設計された多数の Web コントロールを含んでいます。
前回の記事では、ナビゲーション
Web コントロールを通じて Web.sitemap XML サイトマップ ファイルを
作成する方法と、次のようなサイト ナビゲーション情報を表示する方法を分析しました。
サイト マップ階層全体を表示するために使用される、折りたたみ可能な垂直方向のツリーを表示します
。
前の記事では、サイト マップ ファイルとナビゲーション Web コントロールの機能と機能についてのみ説明しました。 。このセクションでは、プログラムによるサイト マップ情報の制御に注目し、SiteMapPath ナビゲーション Web コントロールを詳しく調べます。
2. サイト マップ
この記事の例では、第 1 部で作成したサイト マップを使用します。サイトマップ XML ファイルの正確な構文はパート 1 で確認するか、この記事の最後でダウンロードできます。これらの例で使用されるサイト構造のグラフィック表現を以下に示します。
3. プログラムで制御されるサイト マップ
サイト マップは、関連するサイト マップ ノードのコレクションです。通常、各サイトマップ ノードにはタイトル、URL、説明が含まれます。上に示した画像はサイトマップの例で、各四角形はサイトマップ ノードを表しています。 ASP.NET では、サイトマップの指定に特定の形式は必要ありませんが、XML 形式ファイルを使用するデフォルト オプションが提供されています。 (XML ファイルの詳細については、パート 1 を参照してください。)
ASP.NET には、サイト マップへの読み取り専用のプログラムによるアクセスを提供する SiteMap というクラスが用意されています。このクラスは、この記事の後半で分析する 2 つのコントロールによって内部的に使用されます。
SiteMapPath - 訪問したページの位置とそのサイト構造に基づいてブレッドクラムを生成します。具体的には、SiteMapPath は SiteMap.CurrentNode プロパティによって返されたノードから開始し、階層をルートまでたどります。
· SiteMapDataSource - このコントロールは階層データ ソースを作成し、サイト マップの構造をマップします。 TreeView や Menu などの別の Web コントロールにサイト マップ情報を表示するために、Web コントロールはサイト マップを直接クエリせず、サイト マップ構造の読み取りを担当する SiteMapDataSource コントロールにバインドします。
SiteMap クラスには、RootNode と CurrentNode という 2 つのプロパティがあります。どちらのプロパティも SiteMapNode インスタンスを返します。 SiteMapNode クラスはサイト マップで定義されたノードを表し、ノードを説明するプロパティ (タイトル、URL、説明) と、階層をプログラムで制御するプロパティ (ParentNode、ChildNodes、NextSibling、PreviousSibling など) を持ちます。
SiteMap クラスは独自の ASP.NET ページで使用できます。たとえば、サイトのメイン ページに 3 つの HyperLink コントロールを追加し、さらに、CurrentNode に NextSibling、PreviousSibling、または ParentNode があるかどうかを確認する少しのプログラミングを追加するだけで、すべてのページに Next、Previous、Up リンクを表示できます。具体的には、次のマークアップをメイン ページに追加します。
[<asp:HyperLink ID="lnkPrev" runat="server">Prev</asp:HyperLink>] |
[<asp:HyperLink ID="lnkUp" runat="server">上</asp:HyperLink>] |
[<asp:HyperLink ID="lnkNext" runat="server">Next</asp:HyperLink>]
メイン ページの Page_Load イベント ハンドラは次のようになります。
If SiteMap.CurrentNode IsNot Nothing then
'次/前/上のリンクを設定するIf SiteMap.CurrentNode.PreviousSibling IsNot Nothing then
lnkPrev.NavigateUrl = SiteMap.CurrentNode.PreviousSibling.Url
lnkPrev.Text = "< Prev (" & SiteMap.CurrentNode.PreviousSibling.Title & ")"
それ以外
lnkPrev.NavigateUrl = String.Empty
lnkPrev.Text = "<前"
終了の場合
SiteMap.CurrentNode.ParentNode が何もない場合
lnkUp.NavigateUrl = SiteMap.CurrentNode.ParentNode.Url
lnkUp.Text = "Up (" & SiteMap.CurrentNode.ParentNode.Title & ")"
それ以外
lnkUp.NavigateUrl = String.Empty
lnkUp.Text = "上"
終了の場合
SiteMap.CurrentNode.NextSibling が何もない場合
lnkNext.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url
lnkNext.Text = "(" & SiteMap.CurrentNode.NextSibling.Title & ") 次へ >"
それ以外
lnkNext.NavigateUrl = String.Empty
lnkNext.Text = "次へ>"
終了の場合
End If
これにより、メイン ページから継承するすべてのページに、次へ、上へ、および前への 3 つのハイパーリンクが追加されます。以下のスナップショットを参照してください。
4. SiteMapPath コントロールを使用してブレッドクラムを表示します。SiteMapPath
コントロールはブレッドクラムを表示します。これは、ユーザーがサイト構造内のどこにいるかを示すために使用されます。 SiteMapPath コントロールの出力は、次の 3 つの要素によって決まります。
· サイト マップで定義されたサイトの構造
· アクセスされているページ
·ページに
SiteMapPath コントロールのプロパティ値が含まれている場合。
SiteMapPath コントロールにアクセスすると、SiteMapPath コントロールはページの URL マップをサイトマップで定義されたサイトマップ ノードの URL 値に変換しようとします。一致するものが見つかった場合、コントロールは構造をルートまで走査し、次の出力を生成します: RootNode>ParentNode>...>ParentNode>CurrentNode。ここでの CurrentNode はサイトマップ ノードのタイトルです。これは、現在のページ リクエストの URL をマップするために使用されます。サイトマップ ノードに URL 値が定義されている場合、RootNode と ParentNode はハイパーリンクとして生成されます。 "履歴ブック" ページ (Books/History.aspx) の SiteMapPath コントロールは、ホーム > ブック > 履歴を生成し、また、それぞれ Default.aspx と Books/Default.aspx を指すハイパーリンクの形式でホームとブックを生成します。 。 Books/Default.aspx にアクセスすると、SiteMapPath によって Home>Books が生成されます。
明確に言うと、SiteMapPath の出力は、サイトマップ自体と、アクセスされているページの両方に依存します。 SiteMapPath の出力は、このコントロールのプロパティを通じてカスタマイズできます。標準 Web コントロール形式にはいくつかのプロパティ (BackColor、Font、ForeColor など) があり、SiteMapPath に固有の設定もいくつかあります。次のものが含まれます。
u PathDirection - RootToCurrent (デフォルト) または CurrentToRoot の 2 つの値のいずれかをとります。値が RootToCurrent の場合、「履歴ブック」ページのブレッドクラムは Home>Books>History として生成され、値が CurrentToRoot の場合、出力は History>Books>Home になります。
·PathSeparator - ブレッドクラム内の各ノードを区切るために使用される文字列を指定します。デフォルトは >
·RenderCurrentNodeAsLink - ブール属性 - CurrentNode をリンクとして生成するかどうかを指定します。デフォルトは False です。
·ParentLevelsDisplayed - 整数値 - ブレッドクラムによって表示されるツリー構造の高さを制限するために使用できます。デフォルトでは、この属性の値は -1 であり、制限がないことを意味します。値を 1 に設定すると、[履歴ブック] ページにブレッドクラムの [書籍] > [履歴] が生成されます。 SiteMapPath コントロールは "History" から "Book" までの 1 つの親までしか移動しないため、ルートは含まれません。
· ShowToolTips - サイトマップ ノードに説明値がある場合、このプロパティが True (デフォルト) に設定されていると、各ブレッドクラム ノードのツールヒント テキストとして説明が表示されます。
SiteMapPath コントロールのさまざまな部分に対して、BackColor、Font、ForeColor などを設定するために使用できるスタイル プロパティもあります。 NodeStyle プロパティを使用してブレッドクラム内のノードの外観をカスタマイズでき、RootNodeStyle と CurrentNodeStyle を使用してブレッドクラム内の最初と最後のノードをさらにカスタマイズできます。一般に、SiteMapPath コントロールをフォーマットする最も簡単で最も美しい方法は、「自動フォーマット」ウィザードを使用することです。これは、コントロールの機密タグを介して有効にできます。
5. 生成された出力をテンプレートでカスタマイズする
SiteMapPath には 4 つのテンプレートが含まれており、生成された出力をさらにカスタマイズできます。テンプレートを使用すると、静的 HTML マークアップ、Web コントロール、およびデータ バインディング構文を組み合わせることができます。DataList コントロールやリピーター コントロールを使用したことがある場合は、テンプレートについてはすでによく知っているでしょう。 ASP.NET 2.0 のテンプレートは基本的に ASP.NET 1.x と同じですが、ASP.NET 2.0 ではデータ バインディング式に新しい、より簡潔な構文がいくつか導入されています。たとえば、ASP.NET 1.x では、列の値を取得するには、構文 <%# DataBinder.Eval(Container.DataItem, PropertyName) %> を使用する必要があります。 ASP.NET 2.0 では、この古い構文を引き続き使用できますが、オプションで短いバージョンの <%# Eval(PropertyName) %> を使用できます。
デフォルトでは、SiteMapPath はルート ノードと親ノードを通常のハイパーリンクとして生成するため、ユーザーがリンクをクリックすると、すぐにコントロール階層ツリーを上に戻ることができます。ただし、ユーザーに情報を送り返す前に、サーバー側で処理を行う必要がある場合があります。ユーザーの移動先を記録したり、ページに加えた変更を自動的に保存したりする場合があります。これは、テンプレートを使用し、ノードを LinkButton として生成することで実現できます。
たとえば、SiteMapPath のルート ノードを LinkButton として生成するだけの場合は、次のタグを使用して <RootNodeTemplate> を SiteMapPath コントロールに追加できます:
<asp:SiteMapPath ID="SiteMapPath1" runat="server" >
<ルートノードテンプレート>
<asp:LinkButton ID="LinkButton1" runat="サーバー"
Text='<%# Eval("title") %>'
CommandArgument='<%# Eval("url") %>'
OnCommand="LinkButton1_Command">
</asp:リンクボタン>
</RootNodeTemplate>
</asp:SiteMapPath>
このタグは、LinkButton コントロールを SiteMapPath に追加します。その Text プロパティは、対応する SiteMapNode の Title プロパティに割り当てられます。 LinkButton をクリックすると、ポストバックが発生し、コントロールの Command イベントが発生します。これにより、LinkButton1_Command イベント ハンドラーがアクティブになります。 SiteMapNode の Url プロパティは、CommandArgument プロパティを通じてこのイベント ハンドラーに渡されます。このイベント ハンドラーでは、必要なサーバー側の処理を実行し、Response.Redirect(e.CommandArgument) を通じてユーザーが要求したページにユーザーを誘導できます。