Практическое руководство. Использование маршрутизации в веб-формах
Обновлен: Ноябрь 2007
Маршрутизация ASP.NET позволяет обрабатывать URL-запросов, не сопоставляемые с физическим файлом в веб-приложении. По умолчанию маршрутизация ASP.NET включена в приложениях ASP.NET для платформы динамических данных или платформы MVC, однако не включена в проектах веб-узлов ASP.NET. Следовательно, для использования маршрутизации в веб-узле ASP.NET необходимо выполнить некоторые действия для ее включения.
Для включения маршрутизации необходимо изменить файл конфигурации для приложения, зарегистрировав в нем сборку маршрутизации и класс UrlRoutingModule в виде модуля. Также необходимо создать пользовательский обработчик маршрута для данного маршрута. Обработчик реализует интерфейс IRouteHandler и создает экземпляр веб-формы (ASPX-файл), который будет являться фактической конечной точкой для запроса. Наконец необходимо определить маршруты, обслуживаемые обработчиком. Выполнение всех этих действий показано в этом разделе.
Просмотрите видеоролик, демонстрирующий эту возможность.
Чтобы настроить проект веб-узла ASP.NET для маршрутизации
В файле Web.config приложения добавьте в элемент assemblies сборку маршрутизации ASP.NET, как показано в следующем примере.
<add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
Если приложение запускается под управлением IIS 6.0 или IIS 7.0 в классическом режиме, добавьте в элемент httpModules класс UrlRoutingModule, как показано в следующем примере:
<httpModules> <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpModules>
Если приложение запускается под управлением IIS 7.0 в интегрированном режиме, добавьте в элемент modules класс UrlRoutingModule, как показано в следующем примере.
<system.webServer> <modules> <remove name="UrlRoutingModule" /> <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </modules> </system.webServer>
Если приложение запускается под управлением в IIS 7.0 в интегрированном режиме, добавьте в элемент handlers класс UrlRoutingHandler, как показано в следующем примере.
<system.webServer> <handlers> <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </handlers> </system.webServer>
Чтобы создать обработчик
Создайте класс, реализующий интерфейс IRouteHandler.
Реализуйте метод GetHttpHandler. Для указания определенной веб-формы (ASPX-файла ) в качестве конечной точки для запроса, возвратите экземпляр этой веб-формы из метода GetHttpHandler.
В следующем примере показан класс с именем CustomRouteHandler, реализующий интерфейс IRouteHandler. Метод GetHttpHandler вызывает метод CreateInstanceFromVirtualPath для создания экземпляра указанной веб-формы. Этот экземпляр возвращается в качестве конечной точки для запроса.
Public Class CustomRouteHandler Implements IRouteHandler Private _virtualPath As String Public Sub New(ByVal vPath As String) _virtualPath = vPath End Sub Public Property VirtualPath() As String Get Return _virtualPath End Get Private Set(ByVal value As String) _virtualPath = value End Set End Property Public Function GetHttpHandler(ByVal requestContext _ As System.Web.Routing.RequestContext) _ As System.Web.IHttpHandler _ Implements System.Web.Routing.IRouteHandler.GetHttpHandler Dim redirectPage As IHttpHandler redirectPage = _ BuildManager.CreateInstanceFromVirtualPath(VirtualPath, _ GetType(Page)) Return redirectPage End Function End Class
public class CustomRouteHandler : IRouteHandler { public CustomRouteHandler(string virtualPath) { this.VirtualPath = virtualPath; } public string VirtualPath { get; private set; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { var page = BuildManager.CreateInstanceFromVirtualPath (VirtualPath, typeof(Page)) as IHttpHandler; return page; } }
Чтобы зарегистрировать пользовательский обработчик
Если веб-приложение еще не содержит файл Global.asax, создайте его.
Добавьте в файл Global.asax директиву, импортирующую пространство имен System.Web.Routing, как показано в следующем примере.
<%@ Import Namespace="System.Web.Routing" %>
Создайте в файле Global.asax метод, добавляющий определения маршрутов в свойство Routes класса RouteTable.
Вызовите этот метод из Application_Start обработчика событий.
В следующем примере показан метод, регистрирующий класс с именем CustomRouteHandler в качестве обработчика запросов, соответствующих образцу bikes/sale.
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) RegisterRoutes(RouteTable.Routes) End Sub Shared Sub RegisterRoutes(ByVal routes As RouteCollection) routes.Add("BikeSaleRoute", New Route _ ( _ "bikes/sale", New CustomRouteHandler("~/Contoso/Products/Details.aspx") _ )) End Sub
void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.Add("BikeSaleRoute", new Route ( "bikes/sale", new CustomRouteHandler("~/Contoso/Products/Details.aspx") )); }