.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]ルート・パラメータに妥当な日付が渡されているかを判定するには?
[ASP.NET MVC]特定のHTTPメソッドにマッチするルートを定義するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間