Cómo: Utilizar el enrutamiento con formularios web

Actualización: noviembre 2007

El enrutamiento ASP.NET permite administrar solicitudes URL que no se asignan a un archivo físico en la aplicación web. De forma predeterminada, el enrutamiento ASP.NET está habilitado en una aplicación ASP.NET de datos dinámicos o en el marco MVC, pero no está habilitado en los proyectos de sitio web ASP.NET. Por consiguiente, para utilizar el enrutamiento en un sitio web ASP.NET, debe realizar los pasos necesarios para habilitarlo.

Para habilitar el enrutamiento, debe cambiar el archivo de configuración de la aplicación para registrar el ensamblado de enrutamiento y para agregar la clase UrlRoutingModule como un módulo. También debe crear un controlador personalizado para la ruta. El controlador implementa la interfaz IRouteHandler y crea una instancia del formulario Web Forms (el archivo .aspx) que será el extremo real de la solicitud. Finalmente, debe definir las rutas que atiende el controlador. En este tema se muestra cómo se realizan estos pasos.

Vea un vídeo que muestra esta característica.

Para configurar un proyecto de sitio de web ASP.NET para el enrutamiento

  1. En el archivo Web.config de la aplicación, agregue el ensamblado de enrutamiento ASP.NET al elemento assemblies, como se muestra en el ejemplo siguiente:

    <add assembly="System.Web.Routing, Version=3.5.0.0, 
      Culture=neutral, 
      PublicKeyToken=31BF3856AD364E35"/>
    
  2. Si la aplicación se ejecuta bajo IIS 6.0 o IIS 7.0 en modo clásico, agregue la clase UrlRoutingModule al elemento httpModules, como se muestra en el ejemplo siguiente:

    <httpModules>
      <add name="UrlRoutingModule" 
           type="System.Web.Routing.UrlRoutingModule, 
                 System.Web.Routing, 
                 Version=3.5.0.0, 
                 Culture=neutral, 
                 PublicKeyToken=31BF3856AD364E35"/>
    </httpModules>
    
  3. Si la aplicación se ejecuta bajo IIS 7.0 en modo integrado, agregue la clase UrlRoutingModule al elemento modules, como se muestra en el ejemplo siguiente:

    <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. Si la aplicación se ejecuta bajo IIS 7.0 en modo integrado, agregue la clase UrlRoutingHandler al elemento handlers, como se muestra en el ejemplo siguiente:

    <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>
    

Para crear el controlador

  1. Cree una clase que implemente la interfaz IRouteHandler.

  2. Implemente el método GetHttpHandler. Para especificar un determinado formulario Web Forms (archivo .aspx) como el extremo de la solicitud, devuelva una instancia de dicho formulario a partir del método GetHttpHandler.

    En el siguiente ejemplo se muestra una clase denominada CustomRouteHandler que implementa la interfaz IRouteHandler. El método GetHttpHandler llama al método CreateInstanceFromVirtualPath para crear una instancia del formulario Web Forms especificado. Esta instancia se devuelve como el extremo de la solicitud.

    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;
        }
    }
    

Para registrar el controlador personalizado

  1. Si la aplicación web aún no tiene un archivo Global.asax, agréguelo.

  2. Agregue una directiva al archivo Global.asax que importe el espacio de nombres System.Web.Routing, como se muestra en el ejemplo siguiente:

    <%@ Import Namespace="System.Web.Routing" %>
    
  3. Cree un método en el archivo Global.asax que agregue definiciones de ruta a la propiedad Routes de la clase RouteTable.

  4. Llame al método desde el controlador de eventos Application_Start.

    El ejemplo siguiente muestra un método que registra una clase denominada CustomRouteHandler como el controlador de las solicitudes que coinciden con 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")
        ));
    }
    

Vea también

Conceptos

Enrutamiento de ASP.NET

Información general sobre controladores HTTP y módulos HTTP