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


Создание ограничения маршрута (VB)

Стивен Уолтер

В этом руководстве Стивен Уолтер демонстрирует, как можно управлять сопоставлением запросов браузера с маршрутами, создавая ограничения маршрутов с помощью регулярных выражений.

Ограничения маршрутов используются для ограничения запросов браузера, соответствующих определенному маршруту. Для указания ограничения маршрута можно использовать регулярное выражение.

Например, представьте, что вы определили маршрут в листинге 1 в файле Global.asax.

Листинг 1. Global.asax.vb

routes.MapRoute( _
    "Product", _
    "Product/{productId}", _
    New With {.controller = "Product", .action = "Details"} _
)

В листинге 1 содержится маршрут с именем Product. Маршрут продукта можно использовать для сопоставления запросов браузера с ProductController, содержащимся в листинге 2.

Листинг 2. Controllers\ProductController.vb

Public Class ProductController
    Inherits System.Web.Mvc.Controller
    Function Details(ByVal productId As Integer) As ActionResult
        Return View()
    End Function
End Class

Обратите внимание, что действие 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-адреса, соответствующие маршруту. Измененный маршрут продукта в листинге 3 содержит ограничение регулярного выражения, которое соответствует только целым числам.

Листинг 3. Global.asax.vb

routes.MapRoute( _
   "Product", _
   "Product/{productId}", _
   New With {.controller = "Product", .action = "Details"}, _
   New With {.productId = "\d+"} _
)

Регулярное выражение \d+ соответствует одному или нескольким целым числам. Это ограничение приводит к тому, что маршрут Продукта будет соответствовать следующим URL-адресам:

  • /Product/3
  • /Product/8999

Но не следующие URL-адреса:

  • /Product/apple
  • /Product

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