ルート制約を作成する (C#)
投稿者: Stephen Walther
このチュートリアルでは、Stephen Walther が、正規表現を使用してルート制約を作成して、ブラウザー要求がルートと一致する方法を制御する方法を示します。
ルート制約を使用して、特定のルートに一致するブラウザー要求を制限します。 正規表現を使用してルート制約を指定できます。
たとえば、Global.asax ファイルのリスト 1 でルートを定義したとします。
リスト 1 - Global.asax.cs
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"}
);
リスト 1 には、Product という名前のルートが含まれています。 Product ルートを使用して、ブラウザー要求をリスト 2 に含まれる ProductController にマップできます。
リスト 2 - Controllers\ProductController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
public ActionResult Details(int productId)
{
return View();
}
}
}
Product コントローラーによって公開される Details() アクションは、productId という名前の単一のパラメータを受け入れることに注目してください。 このパラメータは整数パラメータです。
リスト 1 で定義されているルートは、次のいずれかの URL と一致します。
- /Product/23
- /Product/7
残念ながら、このルートは次の URL とも一致します。
- /Product/blah
- /Product/apple
Details() アクションは整数パラメータを想定しているため、整数値以外のものを含む要求を行うとエラーが発生します。 たとえば、ブラウザーに URL /Product/apple を入力すると、図 1 のエラー ページが表示されます。
図 01: エラー ページを示しています (クリックするとフルサイズの画像が表示されます)
実際に行いたいのは、適切な整数 productId を含む URL にのみ一致することです。 ルートを定義するときに制約を使用して、ルートに一致する URL を制限できます。 リスト 3 の変更された Product ルートには、整数にのみ一致する正規表現制約が含まれています。
リスト 3 - Global.asax.cs
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"},
new {productId = @"\d+" }
);
正規表現 \d+ は、1 つ以上の整数と一致します。 この制約により、Product ルートは次の URL と一致します。
- /Product/3
- /Product/8999
しかし、次の URL とは一致しません。
/Product/apple
/Product
これらのブラウザー要求は、別のルートによって処理されるか、一致するルートがない場合は、"リソースが見つかりませんでした" エラーが返されます。