しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

URL ルーティング再考

よく見る http://domain/shiba-yan といった、ユーザー ID がすぐ後ろに付く URL ルーティングの定義。

routes.MapRoute(
    "Users",
    "{id}/{action}",
    new { controller = "user", action = "details" },
    new { id = @"([A-Za-z0-9][\w\-]+)" }
);

これでさっきの URL にアクセスすると UserController.Details("shiba-yan") が呼び出されます。http://domain/shiba-yan/edit にアクセスしたときには UserController.Edit("shiba-yan") が呼ばれます。まあ、これは問題ないとする。

しかし、この方法で例えば登録されたブックマークに対する URL を考えると http://domain/bookmark/1 になって、編集 URL は http://domain/bookmark/1/edit になる。
この URL を作るためのルーティングは

routes.MapRoute(
    "Bookmarks",
    "bookmark/{id}/{action}",
    new { controller = "bookmark", action = "details" },
    new { id = @"\d+" }
);

てな感じになるはず。でもアクションと ID が逆転してるのはなんとなく気持ち悪い。

でも AtomPub とかで CRUD 操作を HTTP Method で行うときには http://domain/bookmark/details/1 に PUT/DELETE 投げるより、短い URL のがいいよねってか details に対して操作するってのはきもいよね。

そういえば、MapRoute の 4 番目の引数ではルーティングの条件を正規表現使って書けます。例えば id が数字かどうかで別のアクションに振り分けたりも出来るはずです。しないけど。