ルート制約を作成する (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 つのパラメーターを受け入れることに注意してください。 このパラメーターは整数パラメーターです。

リスト 1 で定義されているルートは、次のいずれかの URL と一致します。

  • /Product/23
  • /Product/7

残念ながら、ルートは次の URL とも一致します。

  • /Product/blah
  • /Product/apple

Details() アクションは整数パラメーターを必要とするため、整数値以外のものを含む要求を行うとエラーが発生します。 たとえば、ブラウザーに URL /Product/apple を入力すると、図 1 のエラー ページが表示されます。

[New Project]\(新しいプロジェクト\) ダイアログ ボックス

図 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

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