Предыдущий ролик Следующий ролик  

Видео урок: Exploring ASP.NET routing

Основы ASP.NET MVC 5

В этом видео мы более подробно разберем, как можно конфигурировать преобразование веб-запросов в действия контроллера, известное как "маршрутизация". При выборе того действия контроллера, которое будет обрабатывать данный запрос, движок маршрутизации ASP.NET полагается на URL-паттерны. До этого момента мы анализировали, что происходит, когда мы запрашиваем действия HomeController с помощью home/index или home/about. Мы могли бы сказать, что эти запросы соответствуют паттерну home/action, где action - это имя метода действия класса HomeController.

Чтобы еще больше все обобщить, можно даже сказать, что эти запросы соответствуют паттерну controller/action. В такой форме записи controller - это первая часть имени класса контроллера. Примерно таким паттерном будет пользоваться движок маршрутизации. Но в правила маршрутизации наверняка можно добавить дополнительные фрагменты, или сегменты, как мы их называем. Один из таких сегментов вы уже видели в шаблоне проекта - необязательный параметр ID. Для home и about не нужно было передавать никакого параметра ID, но позднее, когда нам захочется рассмотреть какого-то пользователя, какую-то транзакцию или захочется обновить аккаунт, нам, возможно, потребуется передать в URL некую информацию, которая поможет идентифицировать конкретную запись.

Поэтому важно, чтобы движок маршрутизации понимал, что это необязательный параметр. Сейчас мы посмотрим, как это настраивается. В каталоге Root нашего MVC-приложения находится папка App_Start. Если мы откроем эту папку, то увидим, что одним из ее элементов является класс RouteConfig. Давайте проанализируем этот файл. Класс RouteConfig имеет только один метод под названием RegisterRoutes. Он вызывается при запуске вашего приложения. Этот метод можно увидеть, если в файле глобальных классов приложения найти метод Application_Start.

Вот этот IgnoreRoute мы и вызываем, потому что любой запрос, содержащий .axd, предназначен для конкретных ресурсов или утилит системы и будет обрабатываться совершенно другим обработчиком. Символ звездочки перед pathinfo означает, что последний сегмент этого URL-паттерна должен восприниматься как обобщение. То есть нужно, чтобы после axd/ совпадал не только один символ, но и любая последовательность символов, даже если в ней есть дополнительные слэши. Затем идет вызов MapRoute.

В нем используются именованные параметры, с тем чтобы его можно было легко прочитать. Сам маршрут носит название "Default", обладает URL-паттерном, который мы только что обсуждали, и далее в нем указан видовой объект для параметра defaults, который определяет, какие значения по умолчанию должны использоваться в случае, если контроллер и действие заданы не в соответствии с этим паттерном. Еще в нем указано, что параметр ID является необязательным. У метода MapRoute есть множество перегрузок, но давайте на основании этого метода настроим еще один простой маршрут.

Целью этого маршрута будет идентификация URL, который некто может использовать для извлечения серийного номера вашего банкомата. Итак, назовем его "Serial number" (Серийный номер). В HomeController я помещу соответствующее действие, но давайте предположим, что в пути запроса не должно содержаться слово "home" и что этот метод должен вызываться только при вводе /serial. В таком случае в качестве url я могу использовать просто "serial". Но только ради примера давайте добавим параметр, который позволит пользователю запрашивать другой формат, например, серийный номер в нижнем регистре.

Итак, после serial/ я добавлю метку-заполнитель letterCase. Затем в объекте default для параметра controller я оставлю значение "Home", а для параметра action введу значение "Serial". И пусть значением по умолчанию для letterCase будет "upper". Во время обработки запроса движок маршрутизации всегда будет использовать первый маршрут, в котором сможет найти эти соответствия. Таким образом, если бы мы оставили все как есть, запустили бы наше приложение и ввели в строке запроса /serial, то движок маршрутизации действительно попытался бы использовать первый маршрут, который бы ему подошел, поскольку в нем для действия указано значение по умолчанию.

И он искал бы действие index контроллера serial, которое на самом деле не существует. Чтобы избежать ошибки 404, можно просто поместить маршрут "Serial number" перед первым маршрутом. В результате этот маршрут будет выбираться первым, если он, конечно, соответствует условиям. Для перемещения кода нужно его выделить и, удерживая клавишу ALT, нажать стрелку вверх. Теперь давайте перейдем в HomeController и создадим это действие. Итак, оно будет принимать строковый параметр под названием "letterCase". Я не хочу, чтобы это действие возвращало View, потому что есть вероятность, что внутри моего приложения оно уже используется для получения и отображения серийного номера.

Поэтому мне хотелось бы, чтобы это действие возвращало не View или что-то более сложное, а только строку. Для начала объявим переменную "serial" и установим ее равной созданному серийному номеру - "ASPNETMVC5ATM1". Итак, чтобы действие возвращало только эту строку, я воспользуюсь методом content. Если значение lettercase равно "lower", то вернуть Content(serial.ToLower).

Иначе вернуть Content(serial). Хотя это действие и не возвращает представление, мы все равно можем протестировать его в браузере. Воспользуемся клавишей Ctrl+F5 для запуска приложения, а затем введем /serial. Итак, это наш серийный номер. Если просто добавить в строку запроса /lower, то получим версию серийного номера в нижнем регистре. А так как мы не используем представление, то если заглянуть в исходный код страницы, мы увидим, что кроме этой строки в теле ответа ничего нет. Итак, это все, что касается запросов Get, но при выполнении запросов Post параметры не являются частью URL.

Тогда как же они будут работать? Если параметр не найден в сегменте URL, то движок маршрутизации будет искать его еще и в строке запроса или в post-параметрах. Например, если удалить сегмент letterCase вот отсюда и из секции default, а затем построить решение по клавише Ctrl+Shift+B и обновить страницу, то строку /lower браузер уже не понимает. Но если я добавлю строку запроса и передам letterCase=lower, то получу тот же результат.

Настоящую силу всего этого мы увидим, когда настроим все таким образом, что действительно сможем передавать сюда объект, например, пользователя или транзакцию проверки аккаунта, а наши post-параметры будут автоматически преобразовываться в свойства этого объекта. Теперь мы увидели, где и как настраивать базовые маршруты нашего MVC-приложения.