Маршрутизация предназначена для создания логичных и человеко-понятных URL. В ASP.NET MVC используется особая система маршрутизации веб-адресов. Данная система позволяет шаблонно определить вид адресов веб-страниц и обеспечить адресацию, оптимизированную для поисковых систем (SEO). На основе маршрутизации можно строить логичные схемы веб-адресов понятных людям и программным роботам поисковых серверов.
В отличие от системы IIS URL Rewriting маршрутизация в MVC не изменяет запрашиваемые адреса. Например, при URL Rewriting адрес: /Sources/ASP/WebForms перезаписывается в /Sources.cshtml?section=ASP&type=WebForms для дальнейшей обработки запроса сервером. И только после этого сервер находит и отправляет необходимую страницу. Фактически получается, что у одной страницы несколько веб-адресов. При большом количестве веб-адресов, создаваемых таким образом, проблематично поддерживать подобную схему.
Маршрутизация не изменяет адрес запроса веб-страницы, а сопоставляет его с шаблоном, раскладывающим веб-адрес на составляющие. Например, соответственно шаблону: {section}/{framework}/{type}, URL-адрес запроса /Sources/ASP/WebForms маршрутный анализатор разложит на параметры Source, ASP, WebForms для генерации кода веб-страницы в соответствии этими координатами. Маршрутизация ASP.NET MVC позволяет создавать какие угодно псевдонимы для физических папок и файлов. Таким образом, вы можете создавать шаблоны с адресами, максимально понятными и привлекательными для пользователей сайта.
Для расширения возможностей в шаблоне маршрутизации можно использовать заполнители и константы: {section}/{type}/page. Выражения в фигурных скобках это заполнители и в адресе веб-страницы с ними сопоставляются первая и вторая часть, page является константой и в url она должна быть точно такой же. Например, домен/любое_название_секции/любое_название_типа/page.
По умолчанию каркас ASP.NET MVC создает схему шаблона с заполнителями маршрутов: {controller}/{action}/{id}. Данная схема предлагает в качестве отдельных частей веб-адресов использовать названия контроллеров и их методов Action. В качестве маршрута по умолчанию, для случаев отсутствия каких-либо частей в URL, предлагается шаблон: defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }. Если веб-адрес состоит только из доменного имени, то в качестве необходимых частей будут участвовать контроллер Home и его метод Index. Параметр id опциональный и может отсутствовать в URL. Данный шаблон веб-адреса создается как примерный и позволяет использовать малую долю возможностей маршрутизации. Здесь мы вручную определяем названия контроллеров и методов Action. Такой шаблон годится только для небольших веб-приложений.
Примеры других шаблонов маршрутизации: {controller}/{type}/{id}, defaults: new { controller = "Home", action = "Index", type = UrlParameter.Optional, id = UrlParameter.Optional }.
В этом шаблоне в маршрутизации участвуют контроллеры и их методы Index, распределение запросов происходит с участием опциональных заполнителей type и id. Данный шаблон уже позволяет автоматизировать назначение веб-адресов. Пример получаемого адреса: http://domen.ru/machine/excavator/he-310, http://domen.ru/computer/notebook/asus-345.
Очень удобный шаблон для автоматизации вида: {action }/{page}/{id}defaults: new { controller = "Home", action = "Index", page = UrlParameter.Optional, id = UrlParameter.Optional }.
В данном шаблоне участвует всего один контроллер и несколько методов action. Этот шаблон маршрутизации позволяет создавать автоматические фреймворки для быстрого построения различных веб-сайтов. Заменяя одну базу другой, автоматически будет изменяться тематика и ссылки нового сайта. Новый сайт можно изготовить за кратчайшее время с минимальными коррекциями программного кода.
Шаблон маршрута где сочетание констант и заполнителей: animals/{nameFamily}-family/{nameAnimals}defaults: new { controller = "Animals", action = "Families", nameFamily = UrlParameter.Optional, name = UrlParameter.Optional }. Адреса будут такого вида: http://animals/dog-family/wolf, http://animals/cat-family/tiger.
Маршрутизация гораздо более предпочтительна, чем URL Rewriting. URL Rewriting это скорее вынужденный вариант работы с веб адресами. Используя URL Rewriting сталкиваешься с дублированием адресов одной веб-страницы. Например: перезаписываемый веб-адрес /Sources/ASP/WebForms будет дублироваться ещё и "родным" URL /Sources.cshtml?section=ASP&type=WebForms. Оба адреса работают при запросах, что не очень хорошо для SEO сайта. Маршрутизация же однозначно определяет веб-адрес исключая дублирование контента веб-страниц. Комбинируя в маршрутах названий контроллеров, методов Action, применяя разнообразные сочетания заполнителей и констант можно создавать огромное количество уникальных вариантов веб-адресов.
К статье прикреплены два исходника с различными примерами шаблонов маршрутизации. В качестве базы данных для обоих исходников используются xml файлы. Структура их такова, верхний уровень – каталог содержащий в себе дочерние элементы. Каждый элемент содержит дочерние пункты. Каждый каталог может иметь несколько элементов, каждый элемент множество пунктов.
В первом исходнике применен стандартный шаблон маршрутизации. Название контроллера это отдельный пункт меню, каждый метод Action отдельный пункт субменю. Все названия пунктов меню и субменю строго соответствуют названиям контроллеров и их методов. При необходимости изменить названия пунктов приходится "вручную" изменять названия контроллеров и методы Action. Работа маршрутизации построенная по такому принципу даёт немного вариантов автоматизации работы сайта.
Листинг шаблона маршрутизации по умолчанию:
public staticvoidRegisterRoutes(RouteCollectionroutes){// Правило для служебного использования ASP.NET MVCroutes.IgnoreRoute("{resource}.axd/{*pathInfo}");// В данном исходнике оставляем маршрут по умолчаниюroutes.MapRoute(name:"Default",url:"{controller}/{action}/{id}",defaults:new{controller="Home",action="Index",id=UrlParameter.Optional});}
Во втором исходнике применен другой шаблон маршрутизации, дающий гораздо больше свободы для автоматического создания веб-адресов. Точнее, веб-адреса, посредством Модели, загружаются из базы данных. Распределение всех запросов происходит в одном контроллере. Названия пунктов меню это методы Action. Названия подменю и дополнительных ссылок берутся из базы. Так как основное меню обычно содержит фиксированное количество элементов, то не так сложно изменить названия методов или их псевдонимов, элементы и пункты же будут назначаться автоматически из базы.
Листинг гибкого шаблона маршрутизации:
public staticvoidRegisterRoutes(RouteCollectionroutes){// Правило для служебного использования ASP.NET MVCroutes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name:"Default",url:"{action}/{element}/{item}",// В маршрутизации участвует только один контроллер и несколько его методов Action.// Два последних параметра опциональны и проверяются на наличие в Action defaults:new{controller="Main",action="Index",element=UrlParameter.Optional,item=UrlParameter.Optional});}
Модель исходника организована так, что каждый элемент, каждый полученный пункт из базы имеют координаты (веб-адрес и название) родительских, дочерних и родственных компонентов. Данная особенность дает возможность размещение требуемых ссылок на любой веб-странице сайта.
Во втором исходнике две базы данных, одна имеет большее количество пунктов и если в модели изменить название файла базы, то при загрузке веб-страниц можно будет увидеть автоматическое добавление новых пунктов меню.
Веб-страницы в исходнике используют одну общую страницу макета, с общим дизайном и меню. Страница макета очень удобное место для создания общего программного и HTML кода для дочерних страниц. Трудно устоять перед соблазном создавать в ней меню автоматически, что во втором исходнике и сделано. Меню формируется автоматически, соответственно данным поступающих из базы. Фиксированные названия имеют только основные пункты меню. Для макета страниц очень легко применить любой дизайн, купленный у сторонних разработчиков или скачать из интернета бесплатный, ну и, конечно же, можно создать свой, неповторимый.
Автоматическое генерирование пунктов меню очень удобно для создания сайтов интернет-магазинов. Все основное описание в базе данных, и даже URL веб-страниц находятся в базе. При добавлении новых элементов автоматически создаются ссылки на них, чем значительно облегчается обновление сайта. Не стоит бояться потребления большого количества процессорного времени из-за создания меню на лету. Интеллект ASP.NET позволяет кэшировать (сохранять копии) страницы, а повторно страница загружается из кеша, потребляя мизерное количество аппаратных ресурсов. Обновление кэша (замена копии) происходит автоматически, при изменении контента веб-страницы.
В качестве страниц с HTML кодом выступают шаблоны, т.е. один шаблон на все элементы базы данных, один шаблон на все пункты базы и один шаблон для различных Action. Единственный шаблон использует различные данные и создаётся впечатление, что на сайте множество физических страниц. Данная особенность каркаса ASP.NET MVC значительно повышает скорость создания новых сайтов. При шаблонном построении приложения легко выявляются проблемы: ошибки шаблона выявляются при загрузке любой страницы использующей этот шаблон.
Исходники созданы в MS Visual Studio .NET Community 2015, для тестирования можно использовать MS Visual Studio .NET 2013 и выше, а также SharpDevelop 4.4 и выше. Необходимые пакеты библиотек среда программирования скачивает автоматически при запуске кода на исполнение.