更新 : 2007 年 11 月
Web サイト内の物理ファイルとは対応しない URL 要求を処理するには、ASP.NET ルーティングを使用します。ルートの作成は、URL のパターンを定義し、要求時に応答として呼び出されるハンドラを指定することによって行います。
ルートの定義では、URL 要求にパラメータが欠落していた場合に使用される既定値を指定できます。また、制約を指定することによって、パラメータの値が有効かどうかを検証することもできます。
ルーティングを使用すると、ハイパーリンクの URL を動的に作成するなど、アプリケーション内で URL を生成できるようになります。URL を作成するとき、指定したパラメータに複数のルート定義が一致する場合があります。ルートの登録時に指定したルート名を引数として渡すことにより、URL の作成にどのルートを使用するかを指定できます。
ルートの作成
URL パターンに一致するルートを作成し、その URL パターンに対する要求をどのように処理するかを指定します。
ルートを作成するには
Global.asax ファイルに、Route クラスのインスタンスを作成するメソッドを追加します。クラス コンストラクタには、URL 要求に一致する URL パターンを url パラメータとして渡し、その要求を処理するクラスのインスタンスを routeHandler パラメータとして渡します。
URL パターンに汎用的なパラメータを追加すると、URL 要求に含まれているパラメータ数がルートに定義されているパラメータ数より多い場合でも、ルートを要求に一致させることができます。汎用的なパラメータを追加するには、最後のパラメータ名の前にアスタリスク (*) を挿入します。
ルートのパラメータに既定値を指定する場合は、Defaults プロパティを設定します。
ルートのパラメータ値を検証する場合は、Constraints プロパティに、次のいずれかを設定します。
正規表現を定義する文字列。この正規表現では大文字と小文字は区別されません。
IRouteConstaint インターフェイスを実装し、かつ Match メソッドを持つオブジェクト。
RouteTable オブジェクトの Routes プロパティに Route オブジェクトを追加します。ルート名を指定する場合は Add メソッドを、それ以外の場合は Add メソッドを呼び出します。
Global.asax ファイルの Application_Start ハンドラで、手順 1. で追加したメソッドを呼び出します。
使用例
次の例は、Global.asax ファイルの Application_Start から呼び出される、RegisterRoutes という名前のメソッドを示しています。このメソッドでは、year パラメータと locale パラメータを持つ 2 つの Route オブジェクトを追加しています。URL の生成時には、これらのルートを名前で区別できます。この例は、これらのルートを名前付きのルートとして追加する方法を示しています。このルートには、制約、既定値、および汎用的なパラメータも割り当てられています。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RegisterRoutes(RouteTable.Routes)
End Sub
Shared Sub RegisterRoutes(routes As RouteCollection)
Dim salesUrlPattern As String
Dim expensesUrlPattern As String
Dim salesRoute As Route
Dim expensesRoute As Route
salesUrlPattern = "SalesReport/{locale}/{year}/{*queryvalues}"
salesRoute = New Route(salesUrlPattern, New SalesRouteHandler)
salesRoute.Constraints = New RouteValueDictionary(New With _
{.locale = "[a-z]{2}-[a-z]{2}", .year = "\d{4}"})
salesRoute.Defaults = New RouteValueDictionary(New With _
{.locale = "en-US", .year = DateTime.Now.Year.ToString()})
routes.Add("SalesRoute", salesRoute)
expensesUrlPattern = "ExpensesReport/{locale}/{year}/{*queryvalues}"
expensesRoute = New Route(expensesUrlPattern, New ExpensesRouteHandler)
expensesRoute.Constraints = New RouteValueDictionary(New With _
{.locale = "[a-z]{2}-[a-z]{2}", .year = "\d{4}"})
expensesRoute.Defaults = New RouteValueDictionary(New With _
{.locale = "en-US", .year = DateTime.Now.Year.ToString()})
routes.Add("ExpensesRoute", expensesRoute)
End Sub
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add("SalesRoute", new Route
(
"SalesReport/{locale}/{year}/{*queryvalues}"
, new SalesRouteHandler()
)
{
Constraints = new RouteValueDictionary
{{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}},
Defaults = new RouteValueDictionary
{{"locale", "en-US"}, {"year", DateTime.Now.Year.ToString()}}
});
routes.Add("ExpensesRoute", new Route
(
"ExpensesReport/{locale}/{year}/{*queryvalues}"
, new ExpensesRouteHandler()
)
{
Constraints = new RouteValueDictionary
{{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}},
Defaults = new RouteValueDictionary
{{"locale", "en-US"}, {"year", DateTime.Now.Year.ToString()}}
});
}