|  
 .NET TIPS [ASP.NET MVC]有効期限のあるルーティング規則を定義するには?[3.5、4以降、C#、VB]山田 祥寛2010/08/19  | 
![]()  | 
|  
 | 
|
「TIPS:[ASP.NET MVC]特定のHTTPメソッドにマッチするルートを定義するには?」では、標準の制約条件クラスであるHttpMethodConstraintクラス(System.Web.Routing名前空間)を利用して、ルートの制約を定義する方法について紹介した。
しかし、.NET Framework 4の時点で標準提供される制約条件クラス(IRouteConstraintインターフェイス(System.Web.Routing名前空間)の実装クラス)は、HttpMethodConstraintクラスだけである。そのほか、制約条件を課したい場合には、自分でIRouteConstraint実装クラスを用意しなければならない。
本稿では、自作の制約条件を定義する例として、特定の日時までの間だけ有効なルートを定義してみよう(指定日時を経過すると、ルートは無効化される)。このような制約条件は、特定の期間のみ展開するキャンペーン・ページを構築する場合に利用できるだろう。
それではさっそく、具体的な実装の手順を見ていく。
1. 制約条件クラスを実装する
まずは、制約条件を表すIRouteConstraint実装クラスの定義からだ。
 
  | 
||
| 現在の日時が指定された有効期限より前であるかを判定する制約条件(上:DateTimeConstraint.cs、下:DateTimeConstraint.vb) | 
制約条件クラス(IRouteConstraint実装クラス)で実装しなければならないメソッドは、Matchメソッドだけである。これはルートを決定する際に呼び出されるメソッドで、そのルートが有効であるかどうかをtrue/falseで返す必要がある(ルートを無効にする場合はfalse)。
また、Matchメソッドが受け取る引数は、先頭から順に以下の表のとおりである。
| データ型 | 概要 | 
| HttpContextBase | HTTP通信に関する情報を管理 | 
| Route | ルート定義に関する情報を管理 | 
| string | 制約のキー名(MapRouteメソッドで定義された文字列) | 
| RouteValueDictionary | ルート・パラメータのセット | 
| RouteDirection | リクエストURLの処理方法 | 
| Matchメソッドが受け取る引数 | |
 DateTimeConstraintクラスでは、コンストラクタで有効期限を示す変数「_Limit」をセットしておき、これをMatchメソッドで現在の日時と比較しているわけだ()。現在の日時が_Limitよりも未来である場合、Matchメソッドはfalse(ルートは無効)を返す。![]()
2. 制約条件付きのルートを定義する
制約条件クラスが定義できたら、実際にDateTimeConstraint制約を利用したCampaignルートを設定してみよう。ルート定義そのものに関する詳細は、「TIPS:[ASP.NET MVC]ルート定義を追加するには?」を参照していただきたい。
 
  | 
||
| DateTimeConstraint制約条件を適用したCampaignルートを定義(上:Global.asax.cs、下:Global.asax.vb) | ||
| ※VBのコードのコメント部分は、削除しないとビルドに失敗するので、注意してほしい。このコードでは、説明を分かりやすくするために、このように記述している。 | 
| *1 Route/Indexアクションについては、「TIPS:[ASP.NET MVC]ルート定義を追加するには?」で作成したものを使用している。内容にはとりたてて影響しないが、気になる方はそのTIPSの内容も併せて参照していただきたい。 | 
制約条件は、MapRouteメソッドの第4引数に「キー名 = IRouteConstraint実装クラスのインスタンス」の匿名型として指定するのだった。手順1で見たように、DateTimeConstraintクラスのコンストラクタには、有効期限を表すDateTimeオブジェクトを渡す必要がある。つまり、ここでは2010年5月10日12時までを有効期限としたルートを定義していることになる。
以上を理解できたら、さっそく「http://localhost:8080/Campaign/108」のようなURLでアクセスしてみよう。有効期限(2010年5月10日12時)以前の場合には正しくRoute/Indexアクションの内容が、有効期限以降の場合には、404 Not Foundエラーが返され、ルートが無効化されていることが確認できるはずだ。
![]()  | 
| 有効期限のあるルーティング規則を定義したサンプルの実行結果 | 
 制約条件の挙動を確認する際には、コンピュータの日付設定を変更するか、Campaignルートの有効期限を変更すればよい。![]()
| 利用可能バージョン:.NET Framework 3.5 利用可能バージョン:.NET Framework 4 カテゴリ:ASP.NET MVC 処理対象:ルーティング 使用ライブラリ:HttpMethodConstraintクラス(System.Web.Routing名前空間) 関連TIPS:[ASP.NET MVC]特定のHTTPメソッドにマッチするルートを定義するには? 関連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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える 
 
  | 
 |






