.NET TIPS

[ASP.NET MVC]特定のルートを無効化するには?[3.5、4、C#、VB]

山田 祥寛
2010/07/15

 「TIPS:[ASP.NET MVC]ルート定義を追加するには?」では、ASP.NET MVCでさまざまなルート(=ルーティングのためのルール)を追加する方法について紹介した。もっとも、ルートは追加するばかりではない。特定のルート定義だけを無効化することも可能だ。

 例えば、以下のようなルート定義を考えてみよう。

routes.MapRoute(
  "Diary",                         // ルート名
  "Diary/{year}/{month}/{day}",    // URIパターン
  new {
    controller = "Route",          // コントローラ名
    action = "Index"               // アクション名
  }
);
routes.MapRoute( _
  "Diary", _                       ' ルート名
  "Diary/{year}/{month}/{day}", _  ' URIパターン
  New With { _
    .controller = "Route", _       ' コントローラ名
    .action = "Index" _            ' アクション名
  } _
)
Diaryルートを定義するためのコード(上:Global.asax.cs、下:Global.asax.vb)

 Diaryルートは、指定された年月日に対応する日記にアクセスすることを想定したルートである。このようなルート定義で、例えば2006年の日記(「/Diary/2006/〜」)へのアクセスだけを除外したい場合には、以下のようなコードを追記すればよい(追記部分は太字で表している)。

routes.IgnoreRoute("Diary/2006/{month}/{day}");
routes.MapRoute(
  "Diary",
  ……中略……
);
routes.IgnoreRoute("Diary/2006/{month}/{day}")
routes.MapRoute( _
  "Diary", _
  ……中略……
)
「Diary/2006/〜」へのルーティングを除外するコード(上:Global.asax.cs、下:Global.asax.vb)

 特定のURIパターンを除外するのは、IgnoreRouteメソッドの役割である。IgnoreRouteメソッドの構文は、以下のとおりだ。

IgnoreRoute(String url)
IgnoreRouteメソッドの構文
url:URIパターン。

 この状態で、次のようなURLでアクセスした場合の結果は、以下のようになる。

http://localhost:8080/Diary/2006/12/04
サンプルの実行結果
「Diary/2006/〜」ではアクセスできない

 404 Not Foundエラーが返され、確かにルート定義が無効化されていることが確認できる。同じく「http://localhost:8080/Diary/2007/08/05」でアクセスしたときには、正しくページが表示されること(Diaryルートそのものは動作していること)も確認してみよう。

●IgnoreRouteメソッドの注意点

 このように、IgnoreRouteメソッドの構文自体はごくシンプルなものであり、誤解のしようもない。しかし、その記述順序には要注意だ。試しに、IgnoreRouteメソッドをDiaryルート定義の「後方」に移動してみるとどうだろう。

 今度は、先ほどは無効化されていた「http://localhost:8080/Diary/2006/06/25」のようなアドレスでも正しくアクセスできてしまうはずだ。これは、ASP.NET MVCがルーティングを行う際に、MapRoute/IgnoreRouteメソッドの記述順にマッチング処理を行うためだ。そのため、MapRouteメソッドで定義されたDiaryルートが先にマッチしてしまい、IgnoreRouteメソッドによる定義が認識されなくなってしまうのだ。IgnoreRouteメソッドは、無効化の対象となるルート定義(MapRouteメソッド)よりも先に記述しなければならない。

 同様の理由から、MapRouteメソッドで複数のルートを定義する場合も注意が必要だ。繰り返しであるが、ASP.NET MVCではルートは定義(記述)された順番にマッチングを行う。従って、以下のようなルート定義は正しく動作しない。

(1) {controller}/{action}/{id} ({id}は任意)
(2)News/{category}

 この場合、「/News/IT」のようなアドレスは(1)のルートにマッチしてしまうため、(2)には永遠に行き着くことがないためだ。ルートを定義する場合には、

特殊なルートをより先に、汎用的なルートは最後に

なるように順序付けに注意してほしい。End of Article

利用可能バージョン:.NET Framework 3.5
利用可能バージョン:.NET Framework 4
カテゴリ: ASP.NET MVC 処理対象:ルーティング
関連TIPS:[ASP.NET MVC]ルート定義を追加するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET MVC]有効期限のあるルーティング規則を定義するには?
[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?
[ASP.NET MVC]ルート定義を追加するには?
[ASP.NET MVC]特定のHTTPメソッドにマッチするルートを定義するには?
[ASP.NET MVC]ルート・パラメータに妥当な日付が渡されているかを判定するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH