Общие сведения о маршрутизации в ASP.NET MVC (VB)

Стивен Уолтер (Stephen Walther)

В этом руководстве Стивен Уолтер показывает, как платформа ASP.NET MVC сопоставляет запросы браузера с действиями контроллера.

В этом руководстве вы ознакомите с важной функцией каждого приложения MVC ASP.NET, которая называется маршрутизацией ASP.NET. Модуль маршрутизации ASP.NET отвечает за сопоставление входящих запросов браузера с определенными действиями контроллера MVC. По завершении работы с этим руководством вы узнаете, как стандартная таблица маршрутов сопоставляет запросы с действиями контроллера.

Использование таблицы маршрутов по умолчанию

При создании нового приложения ASP.NET MVC приложение уже настроено для использования маршрутизации ASP.NET. ASP.NET маршрутизация настраивается в двух местах.

Во-первых, ASP.NET маршрутизация включена в файле веб-конфигурации приложения (Web.config файле). В файле конфигурации есть четыре раздела, которые относятся к маршрутизации: system.web.httpModules, system.web.httpHandlers, system.webserver.modules и system.webserver.handlers. Будьте внимательны, чтобы не удалять эти разделы, так как без них маршрутизация больше не будет работать.

Во-вторых, что еще более важно, в файле Global.asax приложения создается таблица маршрутов. Файл Global.asax — это специальный файл, содержащий обработчики событий для ASP.NET событий жизненного цикла приложения. Таблица маршрутов создается во время события запуска приложения.

Файл в листинге 1 содержит файл Global.asax по умолчанию для приложения ASP.NET MVC.

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

' Note: For instructions on enabling IIS6 or IIS7 classic mode, 
' visit https://go.microsoft.com/?LinkId=9394802

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

        ' MapRoute takes the following parameters, in order:
        ' (1) Route name
        ' (2) URL with parameters
        ' (3) Parameter defaults
        routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = ""} _
        )

    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

При первом запуске приложения MVC вызывается метод Application_Start(). Этот метод, в свою очередь, вызывает метод RegisterRoutes(). Метод RegisterRoutes() создает таблицу маршрутов.

Таблица маршрутов по умолчанию содержит один маршрут (с именем Default). Маршрут по умолчанию сопоставляет первый сегмент URL-адреса с именем контроллера, второй сегмент URL-адреса — с действием контроллера, а третий сегмент — с параметром id.

Представьте, что вы ввели следующий URL-адрес в адресной строке веб-браузера:

/Home/Index/3

Маршрут по умолчанию сопоставляет этот URL-адрес со следующими параметрами:

  • controller = Home

  • action = index

  • id = 3

При запросе URL-адреса /Home/Index/3 выполняется следующий код:

HomeController.Index(3)

Маршрут по умолчанию включает значения по умолчанию для всех трех параметров. Если контроллер не указан, параметр контроллера по умолчанию имеет значение Home. Если действие не указано, параметр действия по умолчанию имеет значение Index. Наконец, если вы не укажаете идентификатор, параметр id по умолчанию будет использовать пустую строку.

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

/Дома

Так как параметр маршрута по умолчанию задан по умолчанию, ввод этого URL-адреса приведет к вызову метода Index() класса HomeController в листинге 2.

Листинг 2. HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id As String)
        Return View()
    End Function

End Class

В листинге 2 класс HomeController включает метод с именем Index(), который принимает один параметр с именем Id. URL-адрес /Home вызывает метод Index() со значением Nothing в качестве значения параметра Id.

Из-за того, как платформа MVC вызывает действия контроллера, URL-адрес /Home также соответствует методу Index() класса HomeController в листинге 3.

Листинг 3. HomeController.vb (действие индекса без параметра)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index()
        Return View()
    End Function

End Class

Метод Index() в листинге 3 не принимает никаких параметров. URL-адрес /Home приведет к вызову этого метода Index(). URL-адрес /Home/Index/3 также вызывает этот метод (идентификатор игнорируется).

URL-адрес /Home также соответствует методу Index() класса HomeController в листинге 4.

Листинг 4. HomeController.vb (действие индекса с параметром, допускаемым значением NULL)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id? As Integer)
        Return View()
    End Function

End Class

В листинге 4 метод Index() имеет один параметр Integer. Так как параметр является параметром, допускаемым значением NULL (может иметь значение Nothing), метод Index() можно вызвать без возникновения ошибки.

Наконец, вызов метода Index() в листинге 5 с URL-адресом /Home вызывает исключение, так как параметр Id не является параметром, допускающим значение NULL. При попытке вызвать метод Index() вы получите сообщение об ошибке, отображаемой на рис. 1.

Листинг 5. HomeController.vb (действие индекса с параметром Id)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id As Integer)
        Return View()
    End Function

End Class

Вызов действия контроллера, которое ожидает значение параметра

Рис. 01. Вызов действия контроллера, которое ожидает значение параметра (щелкните для просмотра полноразмерного изображения)

URL-адрес /Home/Index/3, с другой стороны, отлично работает с действием контроллера индекса, приведенным в листинге 5. Запрос /Home/Index/3 вызывает метод Index() с параметром Id со значением 3.

Итоги

Цель этого руководства — краткое введение в ASP.NET маршрутизации. Мы изучили таблицу маршрутов по умолчанию, которую вы получаете с помощью нового приложения MVC ASP.NET. Вы узнали, как маршрут по умолчанию сопоставляет URL-адреса с действиями контроллера.