Маршрутизация URL c ASP.NET 4 Web Forms (из серии статей про VS 2010 и .NET 4.0)

[Помимо блога, я в последнее время еще использую Twitter, чтобы публиковать краткие заметки и новые ссылки. Следить за моими публикациями на Twitter вы можете здесь: https://www.twitter.com/scottgu (@scottgu - это мой псевдоним на twitter)]

Это восьмая из серии статей про грядущий выпуск VS 2010 и .NET 4. В сегодняшней публикации я расскажу об одной замечательной возможности среды времени выполнения ASP.NET 4, а именно о возможности использовать маршрутизацию URL (URL routing) со страницами на базе Web Forms.

Что такое маршрутизация URL?

Маршрутизация URL - это возможность, впервые появившаяся в ASP.NET 3.5 SP1 и активно применяемая в приложениях ASP.NET MVC, чтобы сделать используемые в них URL ясными и учитывающими поисковую оптимизацию - в стиле “web 2.0”. Маршрутизация URL позволяет настроить приложение на прием запросов с URL, которые не соответствуют реальным файлам приложения. Вместо этого вы можете с помощью маршрутизации определить URL, которые семантически значимы для пользователей и могут помочь в поисковой оптимизации сайтов.

К примеру, URL для обычной страницы, отображающей категории продуктов, мог бы выглядеть так:

https://www.mysite.com/products.aspx?category=software

С использованием движка маршрутизации URL в ASP.NET 4 вы сможете для отображения той же информации настроить приложение на прием таких запросов:

https://www.mysite.com/products/software

В ASP.NET 4.0 запросы, как в приведенном примере, могут быть сопоставлены как с классами-контроллерами ASP.NET MVC, так и со страницами на базе ASP.NET Web Forms.

Сопоставление запросов с использованием ASP.NET MVC

Движок маршрутизации URL, появившийся в ASP.NET 3.5 SP1, предоставляет мощные возможности для обработки входящих запросов. Обычно для регистрации/отображения URL, соответствующих определенному формату, и сопоставленных с ними обработчиков вам приходилось писать код, выполняемый при запуске приложения.

Ниже приведен пример того, как сегодня вы можете использовать ASP.NET MVC для сопоставления URL /products/software с классом-контроллером под названием “Products”, у которого есть метод “Browse”:

step1

Первый параметр “products-browse” вспомогательного метода MapRoute() является дружественным именем маршрута. Второй параметр “products/{category}” - это фильтр для URL, соответствующий URL /products/software и рассматривающий второй сегмент URL как значение параметра “category”. Этот параметр затем будет передан на обработку в метод Browse() класса ProductsController.

Сопоставление запросов с использованием ASP.NET Web Forms

Теперь ASP.NET 4.0 также позволяет использовать движок маршрутизации URL для сопоставления не только с контроллерами ASP.NET MVC, но и со страницами на базе ASP.NET Web Forms.

Ниже приведен пример того, как вы можете использовать новый вспомогательный метод MapPageRoute() в ASP.NET 4.0 для сопоставления URL /products/software со страницей “Products.aspx”, расположенной в корневом каталоге приложения:

step2

Здесь первые два параметра вспомогательного метода MapPageRoute() - те же, что и у MapRoute() . Первый параметр представляет дружественное имя маршрута, а второй задает формат URL для поиска соответствий. Третий параметр, между тем, указывает на страницу Products.aspx, которая будет обрабатывать запросы вместо класса-контроллера. Вы также можете указать MapPageRoute() дополнительные параметры, чтобы воспользоваться преимуществами “ограничений маршрута” и предоставить “значения параметров по умолчанию” точно так же, как вы можете сделать это в регистрациях маршрутов на базе ASP.NET MVC.

Для страницы Products.aspx вы затем можете написать код, как в примере ниже, использующий свойство Page.RouteData в ASP.NET 4.0 для получения значения параметра “category”, сопоставленного с фильтром URL /products/{category} , и после этого связать полученное значение с категориями продуктов, чтобы отобразить их:

step3

В дополнение к программному доступу к параметрам входящих запросов при помощи кода, как в примере выше, вы также можете воспользоваться преимуществами нового декларативного элемента управления <asp:routeparameter> с любым элементом управления ASP.NET, использующим DataSource, чтобы декларативно связать его со значением из маршрута. К примеру, ниже мы используем выражение с <asp:routeparameter>, чтобы связать параметр @category оператора select с параметром /products/{category} в маршруте:

step4

Получение URL запросов из ASP.NET Web Form

Движок маршрутизации URL в ASP.NET может использоваться как для сопоставления входящих запросов с обработчиками в коде, так и для программной генерации исходящих URL с применением тей же логики регистрации соответствий.

В примере выше когда мы устанавливали соответствие для URL /products/{category} , мы дали маршруту “дружественное имя” “products-browse”. Это позволяет нам теперь также использовать новый вспомогательный метод Page.GetRouteUrl() , чтобы найти маршрут в системе маршрутизации URL, опционально указывая его параметры, и затем получить настоящий URL, который соответствует нашему сгенерированному URL на базе маршрута. Например, нижеприведенный код получит URL “/products/software”:

step6

Вы можете обращаться к упомянутому вспомогательному методу как из ваших файлов code-behind, так и из файлов .aspx.

Теперь также появился нобор методов Response.RedirectToRoute() , которые вы можете использовать, чтобы перенаправить пользователей по определенному маршруту (независимо от того, обрабатывается ли этот маршрут приложением на базе MVC или Web Forms) и при желании передать ему дополнительные параметры.

Обработка сценариев с использованием обратной передачи

Маршрутизация URL в ASP.NET 4.0 полностью поддерживает сценарии с использованием обратной передачи (PostBack). Элемент управления <form runat=”server”> автоматически сгенерирует тот же URL, что привел к рендерингу страницы. К примеру, если вы получаете доступ к странице с помощью URL /products/software, то любой выполняющийся на стороне сервера элемент управления <form runat=”server”> на этой странице сгенерирует для клиента HTML-элемент <form action=”/products/software”> - это означает, что любые сценарии с использованием обратной передачи сохранят исходный URL страницы.

За счет этого становится по-настоящему просто поддеживать в сценариях с использованием обратной передачи и Web Forms ясные, учитывающие поисковую оптимизацию URL, и у вас пропадет необходимость использовать различные трюки, к которым сегодня прибегают разработчики, чтобы достичь аналогичных эффектов при работе с модулями переписывания URL (URL rewriting modules).

Резюме

В ASP.NET 4.0 стало по-настоящему просто реализовать ясные, поддерживающие поисковую оптимизацию URL как в приложениях ASP.NET MVC, так и ASP.NET Web Forms (у вас также могут быть приложения, сочетающие эти два подхода).

Движок маршрутизации URL позволяет вам с легкостью зарегистрировать URL любых видов и форматов и сопоставить им любые обработчики, какие вы пожелаете. А поскольку этот движок может использоваться как для сопоставления с URL входящих запросов, так и для генерации исходящих URL, вы можете на более позднем этапе разработки изменить сопоставления URL и при этом не беспокоиться о необходимости модификации какого-либо кода страниц или классов-контроллеров, чтобы отразить сделанные изменения; это позволит вам гораздо проще создавать приложения с поддержкой поисковой оптимизации.

Надеюсь, вы нашли для себя что-то полезное,

Скотт

оригинал статьи