ちょっと先取り Routing 4:その1 PageRouteHandler
ASP.NET 4 のホワイトペーパーを見ると、Routingに関して以下の機能が追加されています。
・MapPageRoute
特定のRoutingパターンに対して特定のページを設定する。
・Page.RouteData
RouteDataをページ内のプログラムで利用するために取得する手段を提供する。
・RouteUrl expression
Routing用のURL設定をaspxページ内で定義されたコントロールに渡す手段を提供する。
・RouteValue expression
RouteDataをaspxページ内で定義されたコントロールに渡す手段を提供する。
・RouteParameter
RouteDataをDataSourceコントロールにParameterとして渡す手段を提供する。
これらの機能を用いることでRoutingを気軽に利用できるようになると考えられます。
しかし、こんな便利そうな機能セット、なんとか3.5 SP1の環境で利用できないものでしょうか。
ということで、上記の機能そのものではないにしても、同じような機能を用意し、利用する方法を探ってみます。
第1回目としてはMapPageRouteのベースと考えられるPageRouteHandlerを作成します。
まず最初にRoutingを利用するための環境を整えましょう。
新しいWebサイト(とりあえずRoutingTestという名前をつけます)を作成します。
web.configファイルの system.web/compilation/assemblies 要素に以下の記述を追加します。
<add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
これは System.Web.Routing.dllを利用する、という設定になります。
それから同じくweb.configファイルの system.web/httpmodules 要素に以下の記述を追加します。
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
これは Routing用のModule(UrlRoutingModule)を利用する、という設定です。
とりあえずVisualStudio や Visual Web Developterのテスト環境では、以上の設定でRoutingが利用できるようになります。
※IIS7以降の環境で動作させるためには こちらのMSDNのページを参考にしてください。
次に、PageRouteHandlerクラスを作成します。
新しいクラスとしてPageRouteHandler.csファイルを追加しましょう。
このファイルには以下のプログラムを記述します。
using System.Web;
using System.Web.Routing;
using System.Web.Compilation;
using System.Web.UI;
public class PageRouteHandler : IRouteHandler
{
string virtualPath = string.Empty;
public PageRouteHandler(string vPath)
{
virtualPath = vPath;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)) as IHttpHandler;
}
}
さて、このPageRouteHandlerクラスが本当に動作するかどうか確認してみましょう。
グローバルアプリケーションクラス(Global.asax)を追加して、2行めに以下を記述します。
<%@ Import Namespace="System.Web.Routing" %>
これでGlobal.asaxの中でSystem.Web.Routingネームスペースが利用できるようになります。
Application_Startメソッドに以下を記述します。
RouteTable.Routes.Add("testRoute",
new Route("test/{id}",
new RouteValueDictionary(new { id = 1 }),
new PageRouteHandler("~/Default2.aspx")));
プロジェクト内にDefault2.aspxを追加して何か目印になる文字列を書いておき、デバッグを実行して以下のようなURLにアクセスしてみましょう。
http://localhost:(port)/RoutingTest/test/
ここで(port)の部分は実行している環境によって異なります。
このURL、つまりWebアプリケーションのルートに test を加えたURLでDefault2.aspxの内容が表示されればPageRouteHandlerクラスが正しく動作しているということになります。
PageRouteHandlerを使う場合、1つのページ毎にRoutingの設定を追加して利用することになります。
Routingの設定数は増えますが、そのほうがぱっと見てわかりやすい、ということがあるかもしれません。