ホーム > .NET, ASP.NET 備忘録 > ASP.NET ルーティングを実装する

ASP.NET ルーティングを実装する

.NET Framework 3.5 SP1でASP.NETにルーティングという機能が追加されました。
ASP.NET ルーティングがどういうものか、という話については次のページをみてもらうのがよいと思います。

ASP.NET ルーティング

上記ページの中にサンプルとしてCategoryRouteHandlerを使った例がありますが、このCategoryRouteHandler、どこを探しても存在していません。
そのあたりの疑問を解決するには次のページを見てください。

方法 : Web フォームでルーティングを使用する

Web.Configの設定のあとに、「ハンドラを作成するには」という項目があります。
ここに記述されていますが、実はIRouteHandlerインターフェイスを実装するクラスを自分で実装しない限りルーティングは利用できない、というのが実情です。
上記ページには単純なIRouteHandlerの実装例がでていますが、もう少し柔軟に運用できるルーティングハンドラとURLに含まれるデータを取り出す方法を実装してみました。

作成したソースは以下のとおりです。

 

using System.Web;
using System.Web.UI;
using System.Web.Compilation;
using System.Web.Routing;
using System.Linq;

public class SimpleRouteHandler : IRouteHandler
{
    public string VirtualPath { get; set; }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string vPath = VirtualPath;
        var keys = from s in vPath.Split(‘/’)
                   where s.Contains(‘{‘) && s.Contains(‘}’)
                   select s.Remove(s.IndexOf(‘}’)).Substring(s.IndexOf(‘{‘) + 1);
        foreach (string key in keys)
        {
            vPath = vPath.Replace("{" + key + "}", requestContext.RouteData.GetRequiredString(key));
        }
        return BuildManager.CreateInstanceFromVirtualPath(vPath, typeof(Page)) as IHttpHandler;
    }
}

public partial class SimpleRouteValue
{
    public static string GetRequiredString(string valueName)
    {
        RouteData routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
        return routeData != null ? routeData.GetRequiredString(valueName) : string.Empty;
    }
}

 

SimpleRouteHandlerクラスがIRouteHandlerインターフェイスを実装したハンドラです。
ルートの定義に対して固定のページを指定するだけでなく、ページの指定時にもルート定義と同様の記述を可能にしています。

※ルート定義とページ指定の例

ルート定義 ページ指定 アクセスURL 実行されるページ
{action}/{id} "~/Update.aspx" http://localhost/site1/Update/4 "~/Update.aspx"
{action}/{id} "~/{action}.aspx" http://localhost/site1/Update/4
http://localhost/site1/Delete/4
"~/Update.aspx"
"~/Delete.aspx"

 

SimpleRouteValueクラスはURLに含まれる値を取り出すために利用します。
上記の例でいうと、Update.aspxやDelete.aspxではidの値を直接取り出すことができません。このあたりはURLの書き換えを行った場合と異なっているところです。
このため、SimpleRouteValueクラスを利用してidの値を取り出せるようにしました。

この実装を利用するためには、まず「方法 : Web フォームでルーティングを使用する」のページを参考にWeb.Configの設定を行ってください。
IIS6.0の場合、IIS7.0の場合、といった場合わけした記述がありますが、すべての設定をしておけば必要ない部分は読み飛ばされるだけなので、あまり気にせず設定してください。

次に、Global.asaxに下記のように記述します。

void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.Add(new Route("{action}/{id}", new SimpleRouteHandler() { VirtualPath = "~/{action}.aspx" }));
}

そして、Update.aspxページを追加し、その中にLabelコントロールを置いて、下記のプログラムを記述します。

protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = SimpleRouteValue.GetRequiredString("id");
}

この状態で、"~/Update/6" のようなURLにアクセスすると、Update.aspxページが実行され、idの値を取り出せていることが確認できると思います。
ルートの規定値や制約も利用できますから試してもらうとどのような動きをするのかわかると思います。

また、Update.aspxページにボタンを追加し、クリック時の処理を記述して実行してみると、ポストバック時にも元のURLにアクセスすることが確認できます。この点もURLの書き換えとは異なっている部分です。URLの書き換えだとaspxページに手を入れないとポストバック時に書き換えられたURLが表示されてしまいます。

なお、IIS6上でASP.NETルーティングで上記のような拡張子のないURLを利用するには、ワイルドカードアプリケーションマッピングを利用してすべてのリクエストがASP.NETに渡されるように設定する必要があります。

URLの表記をできるだけきれいにしたい、と考えている人にとってはASP.NETルーティングは十分検討に値する機能だと思います。
どのような仕組みでこのルーティングが実現されているかについては別途まとめようと思います。

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

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。