ルート制約を作成する (C#)
このチュートリアルでは、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 のエラー ページが表示されます。
図 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
これらのブラウザー要求は別のルートによって処理されるか、一致するルートがない場合は、リソースが 見つかりませんでした というエラーが返されます。