.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実装クラスの定義からだ。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;

namespace MvcAppCs.Extensions {
  public class DateTimeConstraint : IRouteConstraint {

    // ルートの有効期限を表すプライベート変数_Limit
    private DateTime _Limit = DateTime.MaxValue;

    // コンストラクタ(ルートの有効期限をセット)
    public DateTimeConstraint(DateTime limit) {
      this._Limit = limit;
    }

    // ルートが有効であるかを判定するMatchメソッド
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {

      var current = DateTime.Now;

      // 現在の日時が_Limitよりも未来であれば、ルートは無効
      if (current > this._Limit) { return false; }   ……
      return true;
    }
  }
}
Public Class DateTimeConstraint
  Implements IRouteConstraint

  ' ルートの有効期限を表すプライベート変数_Limit
  Private _Limit As DateTime = DateTime.MaxValue

  ' コンストラクタ(ルートの有効期限をセット)
  Public Sub New(ByVal limit As DateTime)
    Me._Limit = limit
  End Sub

  ' ルートが有効であるかを判定するMatchメソッド
  Public Function Match(ByVal httpContext As HttpContextBase, ByVal route As Route, ByVal parameterName As String, ByVal values As RouteValueDictionary, ByVal routeDirection As RouteDirection) As Boolean Implements IRouteConstraint.Match

    Dim current = DateTime.Now

    ' 現在の日時が_Limitよりも未来であれば、ルートは無効
    If current > Me._Limit Then Return False   ……
    Return True
  End Function
End Class
現在の日時が指定された有効期限より前であるかを判定する制約条件(上: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]ルート定義を追加するには?」を参照していただきたい。

using MvcAppCs.Extensions;
  ……中略……
routes.MapRoute(
  "Campaign",                 // ルート名
  "Campaign/{id}",            // URIパターン
  new {
    controller = "Route",     // コントローラ名
    action = "Index",         // アクション名(*1
  },
  new {
    limit = new DateTimeConstraint(
      new DateTime(2010, 5, 10, 12, 0, 0)
    )
  }                           // 制約条件
);
routes.MapRoute( _
  "Campaign", _               ' ルート名
  "Campaign/{id}", _          ' URIパターン
  New With { _
    .controller = "Route", _  ' コントローラ名
    .action = "Index" _       ' アクション名(*1
  }, _
  New With { _
    .limit = New DateTimeConstraint( _
      New DateTime(2010, 5, 10, 12, 0, 0) _
   ) _                        ' 制約条件
  } _
)
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ルートの有効期限を変更すればよい。End of Article

利用可能バージョン:.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
[ASP.NET MVC]ルート・パラメータに妥当な日付が渡されているかを判定するには?
[ASP.NET MVC]特定のHTTPメソッドにマッチするルートを定義するには?
[ASP.NET MVC]特定のルートを無効化するには?
[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?
[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 記事ランキング

本日 月間