Создание ограничения маршрута (C#)
Стивен Уолтер (Stephen Walther)
В этом руководстве Стивен Уолтер демонстрирует, как можно управлять тем, как запросы браузера соответствуют маршрутам, создавая ограничения маршрутов с помощью регулярных выражений.
Ограничения маршрутов используются для ограничения запросов браузера, соответствующих определенному маршруту. Для указания ограничения маршрута можно использовать регулярное выражение.
Например, предположим, что вы определили маршрут в листинге 1 в файле Global.asax.
Листинг 1. Global.asax.cs
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"}
);
В листинге 1 содержится маршрут с именем Product. Маршрут продукта можно использовать для сопоставления запросов браузера с ProductController, содержащимся в листинге 2.
Листинг 2. Controllers\ProductController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
public ActionResult Details(int productId)
{
return View();
}
}
}
Обратите внимание, что действие Details(), предоставляемое контроллером Product, принимает один параметр с именем productId. Этот параметр является целочисленным параметром.
Маршрут, определенный в листинге 1, будет соответствовать любому из следующих URL-адресов:
- /Product/23
- /Product/7
К сожалению, маршрут также будет соответствовать следующим URL-адресам:
- /Product/blah
- /Product/apple
Так как действие Details() ожидает целочисленный параметр, выполнение запроса, содержащего не целочисленное значение, приведет к ошибке. Например, если ввести URL-адрес /Product/apple в браузере, появится страница ошибки на рис. 1.
Рис. 01. Просмотр разрыва страницы (щелкните для просмотра полноразмерного изображения)
То, что вы действительно хотите сделать, это только сопоставить URL-адреса, содержащие правильное целое число productId. При определении маршрута можно использовать ограничение, чтобы ограничить URL-адреса, соответствующие маршруту. Измененный маршрут Product в листинге 3 содержит ограничение регулярного выражения, которое соответствует только целым числам.
Листинг 3. Global.asax.cs
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"},
new {productId = @"\d+" }
);
Регулярное выражение \d+ соответствует одному или нескольким целым числам. Это ограничение приводит к тому, что маршрут Продукта будет соответствовать следующим URL-адресам:
- /Product/3
- /Product/8999
Но не следующие URL-адреса:
/Product/apple
/Product
Эти запросы браузера будут обрабатываться другим маршрутом или, если совпадающих маршрутов нет, будет возвращена ошибка Ресурс не удалось найти .