|
.NET TIPS [ASP.NET MVC]ルート・パラメータに妥当な日付が渡されているかを判定するには?[3.5、4以降、C#、VB]山田 祥寛2010/08/26 |
![]() |
|
|
|
「TIPS:[ASP.NET MVC]有効期限のあるルーティング規則を定義するには?」では、IRouteConstraintインターフェイス(System.Web.Routing名前空間)の実装クラスを利用して、ルートに有効期限を設ける方法について紹介した。もっとも、IRouteConstraint実装クラスの役割は、ルートそのものに対して制約を設けるばかりではない。ルート・パラメータに対する「複雑な」制約条件を定義することも可能だ。
「複雑な」はややあいまいな言い回しであるので、もう少し具体的に見てみよう。例えば、「TIPS:[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?」では、以下のようなArticleルートを定義した。
|
||
| ルート・パラメータに制約条件を追加した例(上:Global.asax.cs、下:Global.asax.vb) | ||
| ※VBのコードのコメント部分は、削除しないとビルドに失敗するので、注意してほしい。このコードでは、説明を分かりやすくするために、このように記述している。 |
ここでは正規表現パターンによって、{year}パラメータは数値4けたであることを、{month}/{day}パラメータは数値1〜2けたであることを、それぞれ定義している。これによって、不正なパラメータ(年月日)がArticleルートにマッチする可能性が低くなり、より精度の高いルーティングが実現できるというわけだ。
このように正規表現による指定だけでも、それなりの制約条件を設定することはできる。しかし、厳密にはこれだけではまだ不足である。というのも、上のArticleルートでは「〜Article/35/03/2010」のようなあり得ない日付パラメータにもマッチしてしまう。当然、これは好ましい状態ではないので、制約条件であらかじめ除外しておきたいところだ。
しかし、このように{year}、{month}、{day}と複数にまたがるパラメータの妥当性、また、数値範囲の妥当性などは、正規表現だけではチェックできない。そこで登場するのが、IRouteConstraint実装クラスなのだ。本稿では、{year}、{month}、{day}パラメータに渡された年月日が妥当な日付であるかどうかを判定する、YmdConstraint制約条件を定義する方法について見ていく。
1. 制約条件クラスを実装する
まずは、制約条件を表すYmdConstraintクラスの定義からだ。
|
||
| ルート・パラメータに渡された日付が妥当であるかをチェックする制約条件(上:YmdConstraint.cs、下:YmdConstraint.vb) |
制約条件クラスで実装しなければならないメソッドは、ルートの妥当性を判定するためのMatchメソッドだけである。Matchメソッドの中でルート・パラメータにアクセスするには、Matchメソッドの第4引数として渡されるRouteValueDictionaryオブジェクト(System.Web.Routing名前空間)にアクセスすればよい。
ここでは、取得した{year}、{month}、{day}パラメータを基に、まずYYYY/MM/DD形式の日付文字列を組み立てる。後は、これをDateTime.Parseメソッドで解析するだけだ。Parseメソッドは不正な日付文字列が指定された場合には、FormatException例外を発生する。ここでは、Parseメソッドのこの性質を利用して、例外が発生した場合にはfalse(=ルートは無効)を返しているわけだ。
2. 制約条件付きのルートを定義する
制約条件クラスが定義できたら、実際にArticleルートに制約条件を適用してみよう。Articleルートそのものに関する詳細は、前述の「TIPS:[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?」も併せて参照していただきたい。
|
||
| YmdConstraint制約条件を適用したArticleルートを定義(上:Global.asax.cs、下:Global.asax.vb) | ||
| ※VBのコードのコメント部分は、削除しないとビルドに失敗するので、注意してほしい。このコードでは、説明を分かりやすくするために、このように記述している。 |
| *1 Route/Indexアクションについては、「TIPS:[ASP.NET MVC]ルート定義を追加するには?」で作成したものを使用している。内容にはとりたてて影響しないが、気になる方はそのTIPSの内容も併せて参照していただきたい。 |
制約条件は、「キー名 = IRouteConstraint実装クラスのインスタンス」の匿名型として指定する。ルート側の記述については、とりたてて特筆すべき点はないだろう。
以上を理解できたら、さっそく、
http://localhost:8080/Article/29/02/2010
のようなURLでアクセスしてみよう。2010年2月29日は存在しない日付であるので、404 Not Foundエラーが返される(=ルートが無効化されている)はずだ。同じく、
http://localhost:8080/Article/28/02/2010
のようなURL(妥当な日付)でアクセスし、Articleルートが正しく適用されることも確認してほしい。![]()
| 利用可能バージョン:.NET Framework 3.5 利用可能バージョン:.NET Framework 4 カテゴリ:ASP.NET MVC 処理対象:ルーティング 使用クラス:IRouteConstraintインターフェイス(System.Web.Routing名前空間) 使用クラス:RouteValueDictionaryクラス(System.Web.Routing名前空間) 使用クラス:FormatExceptionクラス(System) 関連TIPS:[ASP.NET MVC]有効期限のあるルーティング規則を定義するには? 関連TIPS:[ASP.NET MVC]ルート・パラメータに制約条件を追加するには? 関連TIPS:[ASP.NET MVC]ルート定義を追加するには? |
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


