Поделиться через


Создание ограничения маршрута (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.

Диалоговое окно New Project (Новый проект)

Рис. 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

  • Эти запросы браузера будут обрабатываться другим маршрутом или, если совпадающих маршрутов нет, будет возвращена ошибка Ресурс не удалось найти .