.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」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|