Практическое руководство. Использование маршрутизации в веб-формах

Visual Studio 2010

Обновлен: Ноябрь 2007

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

Для включения маршрутизации необходимо изменить файл конфигурации для приложения, зарегистрировав в нем сборку маршрутизации и класс UrlRoutingModule в виде модуля. Также необходимо создать пользовательский обработчик маршрута для данного маршрута. Обработчик реализует интерфейс IRouteHandler и создает экземпляр веб-формы (ASPX-файл), который будет являться фактической конечной точкой для запроса. Наконец необходимо определить маршруты, обслуживаемые обработчиком. Выполнение всех этих действий показано в этом разделе.

Просмотрите видеоролик, демонстрирующий эту возможность.

Чтобы настроить проект веб-узла ASP.NET для маршрутизации

  1. В файле Web.config приложения добавьте в элемент assemblies сборку маршрутизации ASP.NET, как показано в следующем примере.

    <add assembly="System.Web.Routing, Version=3.5.0.0, 
      Culture=neutral, 
      PublicKeyToken=31BF3856AD364E35"/>
    
  2. Если приложение запускается под управлением 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>
    
  3. Если приложение запускается под управлением 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>
    
  4. Если приложение запускается под управлением в 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>
    

Чтобы создать обработчик

  1. Создайте класс, реализующий интерфейс IRouteHandler.

  2. Реализуйте метод 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;
        }
    }
    

Чтобы зарегистрировать пользовательский обработчик

  1. Если веб-приложение еще не содержит файл Global.asax, создайте его.

  2. Добавьте в файл Global.asax директиву, импортирующую пространство имен System.Web.Routing, как показано в следующем примере.

    <%@ Import Namespace="System.Web.Routing" %>
    
  3. Создайте в файле Global.asax метод, добавляющий определения маршрутов в свойство Routes класса RouteTable.

  4. Вызовите этот метод из 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")
        ));
    }
    
Показ: