ホーム > .NET, ASP.NET 備忘録 > ちょっと先取り Routing 4:その1 PageRouteHandler

ちょっと先取り 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の設定数は増えますが、そのほうがぱっと見てわかりやすい、ということがあるかもしれません。

カテゴリー:.NET, ASP.NET 備忘録
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す