ステップ2:要求を処理するASP.NETページを作成する
ASP.NET 4.0では、特別なルートハンドラクラスを作成する必要はありません。MapPageRouteメソッドを使用すれば、その処理がすべて、裏で自動的に実行されます。従って残された作業は、要求(AllCategories.aspx、CategoryProducts.aspx、ViewProduct.aspx)を処理するASP.NETページを作成することだけです。デモプログラムのASP.NETページは、非常に簡単なものです。ルーティングパラメータによってCategoriesまたはProductsテーブルからデータベース結果を取得し、それにデータソースコントロールをプログラムによってバインドし、使用します。
デモプログラムでは、データへのアクセスにLINQ-to-SQLツールを使用しています。App_Codeフォルダの中に、Northwind.dbmlというファイルがあり、そこでNorthwindDataContextクラスを作成します。ViewProduct.aspxページには、商品名、提供企業、単位あたり数量、価格などの関連情報を表示するために定義されたフィールドを持つ、DetailsViewコントロールがあります。このページのコードビハインドクラスのコードを、以下に示します(コードは一部省略されています)。
protected void Page_Load(object sender, EventArgs e)
{
dvProductInfo.DataSource = new Product[] { Product };
dvProductInfo.DataBind();
}
private Product _Product = null;
protected Product Product
{
get
{
if (_Product == null)
{
string productName = Page.RouteData.Values["ProductName"] as string;
NorthwindDataContext DataContext = new NorthwindDataContext();
_Product = DataContext.Products.Where(p => p.ProductName == productName).SingleOrDefault();
}
return _Product;
}
}
Page_Loadイベントハンドラにおいて、DetailsViewコントロールを、Productプロパティによって返されたProductオブジェクトにバインドしています。Productプロパティは、Page.RouteData.Values["ProductName"]という構文により、Page.RouteDataコレクションからURLの中の<商品名>パラメータの値を読み出します。そして、この<商品名>パラメータの値を用いたLINQクエリによって、その特定の商品に関する情報を取得します。
以下のスクリーンショットは、動作中のViewProduct.aspxページを示したものです。ページのURLは/Products/Chaiで、ページにはチャイに関する詳細情報が表示されています(デモプログラムの他のスクリーンショットについては、記事「Using ASP.NET Routing Without ASP.NET MVC」を参照ください。この記事には、Categories/AllとCategories/<カテゴリ名>の両ページのスクリーンショットが掲載されています)。
これで終わりです。ASP.NET 4.0におけるASP.NETルーティングの設定は、以上ですべて完了しました。5つの処理が必要だったASP.NET 3.5 SP1に対し、ステップ数はわずか2つと、格段に容易になっていることが分かります。
ルーティングフレンドリなURLを生成する
ハイパーリンクを作成したり、Response.Redirectによってユーザーをあるページから別のページへとリダイレクトしたりする場合には、ASP.NETページをその実際の名前で参照するよりも、Global.asaxに定義されたルーティングパターンを使用する方が理想的です。例えばViewProducts.aspxページには、Categories/<カテゴリ名>にリンクされた、その商品のカテゴリに含まれる全商品を一覧表示するページに戻るためのリンクがあります。<カテゴリ名>は、表示する商品を含むカテゴリの名前です。このようなルーティングフレンドリなURLを、Page.GetRouteUrlメソッドを用いて生成できます。このメソッドにはいくつかのオーバーロードメソッドがありますが、最も簡単なのは、ルートの名前とパラメータの値という2つの引数を持つものです。
例えば、Categories/<カテゴリ名>ページに戻るための正しいURLを取得するには、以下の構文を使用します。
Page.GetRouteUrl("View Category", new { CategoryName = <カテゴリ名> });
ここで、「View Category」はGlobal.asaxに定義されたルーティングルールの名前であり、<カテゴリ名>はURLの中のCategoryNameパラメータの値です。より具体的なコードを示すと、以下のようになります。
Page.GetRouteUrl("View Category", new { CategoryName = "Beverages" });
Response.Redirectの新しいバージョンである、Response.RedirectToRouteという名前のメソッドも提供されています。Page.GetRouteUrlメソッドと同様に、Response.RedirectToRouteはルート名とパラメータ値を引数とし、適切な、ルーティングフレンドリなURLへとユーザーをリダイレクトします。以下に、特定の商品を紹介するページへとユーザーをリダイレクトする方法を示します。
Response.RedirectToRoute("View Product", new { ProductName = <商品名> });
まとめ
ASP.NETルーティングは、.NET Frameworkにおける強力なライブラリです。開発者はこれを用いることで、アプリケーションで扱うURLを、実際の物理的なファイルから切り離すことができます。ASP.NET 3.5 SP1で導入されたASP.NETルーティングは当初、ASP.NET MVCアプリケーション向けに設計されていました。Web Formアプリケーションで使用することは可能でしたが、その設定には単調な作業の繰り返しが必要で、作成されるコードも、不要ではないかと感じるほど、重複の多いものでした。ASP.NET 4.0では、ASP.NETルーティングライブラリが強化され、より自由かつ直感的にWeb Formアプリケーションに使用できるようになりました。本稿で示したように、Global.asaxに数行のコードを記述するだけで、ルーティングパターンをASP.NETページにマップできます。特別なルートハンドラクラスを作成する必要はなくなりました。ASP.NETルーティングライブラリが裏で自動的に、ルーティングパラメータを、Pageクラスからアクセス可能なRouteDataコレクションに保存します。さらに、これらのRouteDataの値には、SqlDataSourceやObjectDataSourceといったデータソースコントロールから、宣言してアクセスできます。
それでは、ハッピープログラミング!

