全ページで利用するカスタムベースクラス:TheseusPage
Theseusフレームワークの基本となるクラスはTheseusClassです。このクラスはLoadSectionMenuやLoadSideMenuなどのメソッドを定義しており、TopMenus.ascxユーザーコントロールとSideMenu.ascxユーザーコントロールでそれぞれのナビゲーションユーザーインターフェース要素にデータをロードするために使われます。このクラスはWebサイトのすべてのページで使われるので、TheseusPageというカスタムベースページクラスを用意し、TheseusというプロパティでTheseusClassクラスのインスタンスを返すようにしました。従って、Theseusフレームワークを利用するASP.NET Webページはすべて、このカスタムベースクラスから継承して作成する必要があります。
マークアップとコードが同一ファイルにあるASP.NETページを作成する場合、Web.configファイルで<pages>セクションのpageBaseType属性を使って、TheseusPageをすべてのページのベースクラスにできます。
<pages pageBaseType="Wingspan.Web.Core.TheseusPage">
ASP.NETページのマークアップとコードを2つのファイルに分ける場合は、それぞれの分離コードファイルで、各ページの継承元ベースクラスをSystem.Web.UI.PageからWingspan.Web.Core.TheseusPage(または自分で定義したカスタムベースクラス)に変更する必要があります。
public partial class MyPage : Wingspan.Web.Core.TheseusPage
{
...
}
カスタムベースページクラスの使い方と利点の詳細については、「Using a Custom Base Class for your ASP.NET Pages' Code-Behind Classes」を参照ください。
Theseusのエンジン:TheseusClass
Theseusフレームワークの基本となるクラスTheseusClassは、次の2つの重要なタスクを行います。
- 表示するページに応じて、サイトタブ、セクションメニュー、およびサイドメニューにサイトマップのどの項目を表示するかを判別します。
- 現在位置情報を把握して、ナビゲーションUIのどの項目を強調表示するかを判別します。
これらのタスクは、ASP.NETのSiteMapクラスを利用して実現できます。SiteMapクラスはASP.NETフレームワークのクラスで、「サイトのナビゲーション構造のインメモリ表現であり、1つ以上のサイトマッププロバイダにより提供されます」。
SiteMapクラスで最も重要なプロパティはCurrentNodeです。このプロパティは、サイトマップ構造内の、現在要求されているページに対応するSiteMapNodeオブジェクトを表します。
SiteMapNode cn = SiteMap.CurrentNode;
要求されたページがWeb.sitemap内のノードで表現されていない場合には、CurrentNodeはnullを返します。この場合にはTheseusは「非アクティブ」状態になり、いずれのタブも強調表示されていないサイトメニューだけが表示されます。
SiteMapクラスのもう1つの重要なプロパティはRootNodeです。このプロパティは、サイトマップの階層構造のルートを表すSiteMapNodeを返します。CurrentNodeプロパティとRootNodeプロパティを使うと、現在位置情報を特定できます。当然のことながら、現在位置情報は、現在のノードとルートノードの間のパスとなります。
SiteMapExtensionsクラス
Theseusでは、現在位置情報をSiteMapNodeオブジェクトのListとして計算する必要があります。MicrosoftがSiteMap.CurrentBranchのようなプロパティを用意してくれていたらよかったのですが、これはありません。幸い、このListは数行のコードで計算できます。現在位置情報のListの計算以外にも、Theseusで実行する必要があって、SiteMapクラスに実装されていないタスクがあるので、それに対応するメソッドやプロパティをSiteMapExtensionsというクラスにまとめました。このクラスはTheseusClassクラスから参照され、そこではSiteMapExtensionsタイプのメンバ変数SiteMapExtenderが定義されています。
namespace Wingspan.Web.Core
{
public class TheseusClass
{
SiteMapExtensions SiteMapExtender;
public TheseusClass()
{
SiteMapExtender = new SiteMapExtensions();
}
...
}
}
SiteMapExtensionsクラスのコードは単純で、コメントによる説明も挿入してあります。このクラスでは、現在位置情報を表すSiteMapNodeのListを返すCurrentBranchプロパティ、サイトマップ階層における現在のノードのレベルを返すCurrentNodeLevelプロパティ、およびいくつかのメソッドを定義しています。
