.NET TIPS

[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?[3.5、4以降、C#、VB]

山田 祥寛
2010/07/29

 ルーティングとは、リクエスト時のURIに応じて処理の受け渡し先(コントローラ)を決定すること、または、その仕組みのことだ。ASP.NET MVCでは、新規にプロジェクトを作成した時点で、すでにルーティングが有効になっており、最初のうちはルーティングを利用していることを意識すらしないかもしれない。また、デフォルトのルート(=ルーティングのための規則)だけでも、それなりにアプリケーションを構築できてしまうのも事実だ。

 しかし、より使いやすいアプリケーションを構築するという意味では、エンド・ユーザーにとってより分かりやすく、かつ、シンプルなURLの設計は欠かせない。ASP.NET MVCを理解するうえで、ルーティング(ルート)の習得は避けて通れないものである。

 ルーティングの基本について、「TIPS:[ASP.NET MVC]ルート定義を追加するには?」では、まずよくあるルート定義の基本を、いくつかの例とともに紹介した。例えば以下は、「/Article/YYYY/MM//DD」(YYYY/MM/DDは年月日)のようなアドレスにマッチするArticleルートを定義する例である(ルーティング先のRoute/Indexアクションのコードについては、前述のTIPSを参照していただきたい)。

routes.MapRoute(
  "Article",                         // ルート名
  "Article/{day}/{month}/{year}",    // URIパターン
  new {
    controller = "Route",            // コントローラ名
    action = "Index",                // アクション名
    day = DateTime.Now.Day,          // 日
    month = DateTime.Now.Month,      // 月
    year = DateTime.Now.Year         // 年
  }
);
routes.MapRoute( _
  "Article", _                       ' ルート名
  "Article/{day}/{month}/{year}", _  ’URIパターン
  New With { _
    .controller = "Route", _         ' コントローラ名
    .action = "Index", _             ' アクション名
    .day = DateTime.Now.Day, _       ' 日
    .month = DateTime.Now.Month, _   ' 月
    .year = DateTime.Now.Year _      ' 年
  } _
)
URIパターンに{controller}、{action}を含まないArticleルートを定義するコード(上:Global.asax.cs、下:Global.asax.vb)

 このようにルート定義は、URIパターンと、ルート・パラメータのデフォルト値との組み合わせで表現するのが基本である。もっとも、用途によっては、パラメータ値をより制限したいと思う場合もあるかもしれない。

 例えば、上のArticleルートでは{year}、{month}、{day}には年月日が指定されることを想定しているが、いまのままの設定では、以下のようなアドレスにもマッチしてしまう。

/Article/ABC/XYZ/12345
/Article/999/888/11

 せめてこの場合であれば、{year}は4けた、{month}/{day}は1〜2けたの数値のみ受け付けるように制限しておくのが望ましいだろう。そのような場合に、MapRouteメソッドでは第3引数として制約条件を設定することが可能だ。

 例えば、以下は先ほどのArticleルートのパラメータに対して、

  • {year}は数値4けた
  • {month}、{day}は数値2けた

という制約条件を追加した例である(追記部分は太字で表している)。

routes.MapRoute(
  "Article",                         // ルート名
  "Article/{day}/{month}/{year}",    // URIパターン
  new {
    controller = "Route",            // コントローラ名
    action = "Index",                // アクション名
    day = DateTime.Now.Day,          // 日
    month = DateTime.Now.Month,      // 月
    year = DateTime.Now.Year         // 年
  },
  new {
    day = @"\d{1,2}",                // 日は1〜2けた
    month = @"\d{1,2}",              // 月は1〜2けた
    year = @"\d{4}"                  // 年は4けた
  }
);
routes.MapRoute( _
  "Article", _                        ' ルート名
  "Article/{day}/{month}/{year}", _   ' URIパターン
  New With { _
    .controller = "Route", _          ' コントローラ名
    .action = "Index", _              ' アクション名
    .day = DateTime.Now.Day, _        ' 日
    .month = DateTime.Now.Month, _    ' 月
    .year = DateTime.Now.Year _       ' 年
  }, _
  New With { _
    .day = "\d{1,2}", _               ' 日は1〜2けた
    .month = "\d{1,2}", _             ' 月は1〜2けた
    .year = "\d{4}" _                 ' 年は4けた
  } _
)
ルート・パラメータに制約条件を設定した例(上:Global.asax.cs、下:Global.asax.vb)

 制約条件は、「パラメータ名 = パラメータ値にマッチする条件(正規表現)」からなる匿名型として指定できる。「\d」は任意の数値を表すメタ文字である。

 なお、余談ではあるが、C#で正規表現パターンを指定する場合には、文字列リテラルは文字列の先頭に@を付けて「@"……"」(逐語的リテラル文字列)として指定するのが望ましい。通常の「"……"」(標準リテラル文字列)では、文字列に含まれる「\xx」がC#のエスケープ・シーケンスとして解釈されてしまうためだ。

 さて、この状態でもう一度、以下のようなアドレスでアクセスしてみよう。

/Article/ABC/XYZ/12345
/Article/999/888/11

 今度は、いずれのアドレスもArticleルートにはマッチしないことが確認できる。これによって、より精度の高い(想定したパラメータにのみマッチする)ルートを定義できるようになった。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」


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 記事ランキング

本日 月間