次の方法で共有


ルート制約を作成する (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 のエラー ページが表示されます。

The New Project dialog box

図 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

  • これらのブラウザー要求は、別のルートによって処理されるか、一致するルートがない場合は、"リソースが見つかりませんでした" エラーが返されます。