ステップ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といったデータソースコントロールから、宣言してアクセスできます。
それでは、ハッピープログラミング!