Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original.
Traducción
Original
Personas que lo han encontrado útil: 2 de 2 - Valorar este tema

Enrutamiento de ASP.NET

El enrutamiento ASP.NET permite usar direcciones URL que no es necesario asignar a archivos específicos de un sitio web. Dado que la dirección URL no tiene que asignarse a un archivo, se pueden usar direcciones URL que describan la acción del usuario y, por tanto, sean más fáciles de comprender.

El marco de MVC de ASP.NET y los datos dinámicos de ASP.NET extienden el enrutamiento para proporcionar características que se usan únicamente en las aplicaciones de MVC y aplicaciones de datos dinámicos. Para obtener más información sobre ASP.NET MVC, vea ASP.NET MVC. Para obtener más información sobre los datos dinámicos, vea Mapa de contenido de datos dinámicos de ASP.NET.

En una aplicación ASP.NET que no utiliza el enrutamiento, una solicitud entrante de una dirección URL normalmente se asigna a un archivo físico que controla la solicitud, como un archivo .aspx. Por ejemplo, una solicitud de http://server/application/Products.aspx?id=4 se asigna a un archivo denominado Products.aspx que contiene código y marcado para representar una respuesta al explorador. La página web utiliza el valor de cadena de consulta id=4 para determinar el tipo de contenido que se va a mostrar.

En el enrutamiento de ASP.NET, se pueden definir modelos de dirección URL que se asignen a archivos de controlador de solicitudes pero que no necesariamente incluyan los nombres de esos archivos en la dirección URL. Además, se pueden incluir marcadores de posición en un modelo de dirección URL de modo que se puedan pasar datos variables al controlador de solicitudes sin necesidad de una cadena de consulta.

Por ejemplo, en la solicitud de http://server/application/Products/show/beverages, el analizador del enrutamiento puede pasar los valores Products, show y beverages a un controlador de páginas. En este ejemplo, si se define la ruta mediante el modelo de dirección server/application/{area}/{action}/{category}, el controlador de páginas recibirá una colección de diccionarios donde el valor asociado a la clave area es Products, el valor de la clave action es show y el valor de la clave category es beverages. En una solicitud no administrada por el enrutamiento de direcciones URL, el fragmento /Products/show/beverages se interpretaría como la ruta de acceso a un archivo de la aplicación.

Este tema contiene las siguientes secciones:

Una ruta es un modelo de dirección URL que está asignado a un controlador. El controlador puede ser un archivo físico, como un archivo .aspx en una aplicación de formularios Web Forms. También puede ser una clase que procesa la solicitud, como un controlador en una aplicación de MVC. Para definir una ruta, se crea una instancia de la clase Route especificando el modelo de dirección URL, el controlador y, de forma opcional, un nombre para la ruta.

Se agrega la ruta a la aplicación agregando el objeto Route a la propiedad estática Routes de la clase RouteTable. La propiedad Routes es un objeto RouteCollection que almacena todas las rutas de la aplicación.

Normalmente, no hace falta escribir código para agregar rutas a una aplicación de MVC. Las plantillas de proyecto de Visual Studio para MVC incluyen rutas de dirección URL preconfiguradas. Se definen en la clase MvcApplication, la cual se define en el archivo Global.asax.

Un modelo de dirección URL puede contener valores literales y marcadores de posición de variables (denominados parámetros de dirección URL). Los literales y marcadores de posición se encuentran en segmentos de la dirección URL que están delimitados por el carácter de barra diagonal (/).

Cuando se realiza una solicitud, la dirección URL se analiza en segmentos y marcadores de posición, y se proporcionan los valores de las variables al controlador de solicitudes. Este proceso es similar a la forma en que se analizan los datos de las cadenas de consulta y se pasan al controlador de solicitudes. En ambos casos, la información de las variables va incluida en la dirección URL y se pasa al controlador en forma de pares clave-valor. Para las cadenas de consulta, tanto las claves como los valores están en la dirección URL. Para las rutas, las claves son los nombres de marcador de posición que se definen en el modelo de dirección URL y son solo los valores los que se encuentran en la dirección URL.

En un modelo de dirección URL, los marcadores de posición se definen entre llaves ({ y }). Se pueden definir varios marcadores de posición en un segmento, pero deben ir separados por un valor literal. Por ejemplo, {language}-{country}/{action} es un modelo de ruta válido. Sin embargo, {language}{country}/{action} no es un modelo válido porque no hay ningún valor literal ni delimitador entre los marcadores de posición. Por consiguiente, el enrutamiento no puede determinar dónde debe separar el valor del marcador de posición language del valor del marcador de posición country.

En la tabla siguiente se muestran modelos de ruta válidos y ejemplos de solicitudes URL que coinciden con los modelos.

Definición de la ruta

Ejemplo de dirección URL coincidente

{controller}/{action}/{id}

/Products/show/beverages

{table}/Details.aspx

/Products/Details.aspx

blog/{action}/{entry}

/blog/show/123

{reporttype}/{year}/{month}/{day}

/sales/2008/1/5

{locale}/{action}

/US/show

{language}-{country}/{action}

/en-US/show

Modelos de dirección URL típicos en las aplicaciones de MVC

Los modelos de dirección URL para las rutas en las aplicaciones de MVC suelen incluir los marcadores de posición {controller} y {action}.

Cuando se recibe una solicitud, se enruta dicha solicitud al objeto UrlRoutingModule y, a continuación, al controlador HTTP MvcHandler. El controlador HTTP MvcHandler especifica el controlador que se va a invocar agregando el sufijo "Controller" al valor de controlador en la dirección URL para determinar el nombre de tipo del controlador que va a controlar la solicitud. El valor de acción en la dirección URL determina el método de acción que se va a invocar.

Por ejemplo, una dirección URL que incluye la ruta de acceso /Products está asignada a un controlador denominado ProductsController. El valor del parámetro action es el nombre del método de acción que se invoca. Una dirección URL que incluye la ruta de acceso /Products/show daría lugar a una llamada al método Show de la clase ProductsController.

En la siguiente tabla, se muestran los modelos de dirección URL predeterminados así como ejemplos de solicitudes de dirección URL controladas por las rutas predeterminadas.

Modelo de dirección URL predeterminado

Ejemplos de dirección URL coincidente

{controller}/{action}/{id}

http://server/application/Products/show/beverages

{resource}.axd/{*pathInfo}

http://server/application/WebResource.axd?d=...

La ruta con el modelo {resource}.axd/{*pathInfo} se incluye para evitar que las solicitudes de los archivos de recursos web, como WebResource.axd o ScriptResource.axd, se pasen a un controlador.

Para IIS 7.0, no se necesita una extensión de nombre de archivo. Para IIS 6.0, es preciso agregar la extensión de nombre de archivo .mvc al modelo de dirección URL, tal y como se muestra en el siguiente ejemplo:

{controller}.mvc/{action}/{id}

En una aplicación de formularios Web Forms, se crean rutas mediante el método MapPageRoute(String, String, String) de la clase RouteCollection. El método MapPageRoute crea un objeto Route y lo agrega al objeto RouteCollection. Las propiedades del objeto Route se especifican en parámetros que se pasan al método MapPageRoute.

Normalmente, se agregan rutas de un método que se llama desde el controlador del evento Application_Start en el archivo Global.asax. Este enfoque comprueba que las rutas están disponibles cuando se inicia la aplicación. También permite llamar directamente al método cuando se realiza una prueba unitaria de la aplicación. Si desea llamar directamente a un método al realizar una prueba unitaria de la aplicación, el método que registra las rutas debe ser estático (Shared en Visual Basic) y tener un parámetro de RouteCollection.

En el ejemplo siguiente se muestra el código de un archivo Global.asax que agrega un objeto Route que define dos parámetros URL denominados action y categoryName. Las direcciones URL con el modelo especificado se dirigen a la página física denominada Categories.aspx.

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx");
}

Si adopta la convención de MVC por la que se implementan los controladores creando clases que se deriven de la clase ControllerBase y asignándoles nombres que terminen con "Controller", no es necesario agregar manualmente rutas a una aplicación de MVC. Las rutas preconfiguradas invocarán los métodos de acción implementados en las clases de controlador.

Si desea agregar rutas personalizadas a una aplicación de MVC, use el método MapRoute(RouteCollection, String, String) en lugar del método MapPageRoute(String, String, String).

En el siguiente ejemplo, se muestra el código que crea las rutas predeterminadas de MVC en el archivo Global.asax, tal y como se definen en la plantilla de proyecto de Visual Studio para las aplicaciones de MVC.


public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}


Al definir una ruta, puede asignar un valor predeterminado a un parámetro. El valor predeterminado se utiliza si un valor de dicho parámetro no está incluido en la dirección URL. Los valores predeterminados de una ruta se establecen asignando un objeto de diccionario a la propiedad Defaults de la clase Route. En el siguiente ejemplo, se muestra cómo agregar una ruta con valores predeterminados mediante el método MapPageRoute(String, String, String, Boolean, RouteValueDictionary).

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx",
        true,
        new RouteValueDictionary 
            {{"categoryName", "food"}, {"action", "show"}});
}

Cuando el enrutamiento de ASP.NET controla una solicitud URL, la definición de ruta mostrada en el ejemplo (con los valores predeterminados de food para categoryName y show para action) genera los resultados que se enumeran en la tabla siguiente.

dirección URL

Valores de parámetros

/Category

action = "mostrar" (valor predeterminado)

categoryName = "comida" (valor predeterminado)

/Category/add

action = "agregar"

categoryName = "comida" (valor predeterminado)

/Category/add/beverages

action = "agregar"

categoryName= "bebidas"

Para las aplicaciones de MVC, las sobrecargas del método RouteCollectionExtensions.MapRoute, como MapRoute(RouteCollection, String, String, Object, Object), permiten especificar valores predeterminados.

A veces tiene que controlar solicitudes URL que contienen un número variable de segmentos de dirección URL. Al definir una ruta, si una dirección URL tiene más segmentos de los que hay en el modelo, se puede especificar que los segmentos adicionales se consideren como parte del último segmento. Para controlar los segmentos adicionales de esta manera, se debe marcar el último parámetro con un asterisco (*). Este parámetro se denomina parámetro comodín. Una ruta con un parámetro comodín también coincidirá con las direcciones URL que no contienen ningún valor para el último parámetro. En el ejemplo siguiente se muestra un modelo de ruta que coincide con un número de segmentos desconocido.

query/{queryname}/{*queryvalues}

Cuando el enrutamiento de ASP.NET controla una solicitud URL, la definición de la ruta mostrada en el ejemplo genera los resultados que se enumeran en la tabla siguiente.

Dirección URL

Valores de parámetros

/query/select/bikes/onsale

queryname = "select"

queryvalues = "bikes/onsale"

/query/select/bikes

queryname = "select"

queryvalues = "bikes"

/query/select

queryname = "select"

queryvalues = Cadena vacía

Además de comparar una solicitud URL con una definición de ruta por el número de parámetros de la dirección URL, puede especificar que los valores de los parámetros cumplan ciertas restricciones. Si una dirección URL contiene valores que están fuera de las restricciones de una ruta, esa ruta no se utiliza para administrar la solicitud. Agregue restricciones para asegurarse de que los parámetros URL contienen valores que funcionarán en la aplicación.

Las restricciones se definen utilizando expresiones regulares u objetos que implementan la interfaz IRouteConstraint. Al agregar la definición de la ruta a la colección Routes, agregue restricciones creando un objeto RouteValueDictionary que contenga la prueba de comprobación. La clave del diccionario identifica el parámetro al que se aplica la restricción. El valor del diccionario puede ser o una cadena que representa una expresión regular o un objeto que implementa la interfaz IRouteConstraint.

Si proporciona una cadena, el enrutamiento trata la cadena como una expresión regular y comprueba si el valor del parámetro es válido llamando al método IsMatch de la clase Regex. La expresión regular siempre se trata sin distinción entre mayúsculas y minúsculas. Para obtener más información, vea Expresiones regulares de .NET Framework.

Si proporciona un objeto IRouteConstraint, el enrutamiento de ASP.NET comprueba si el valor del parámetro es válido llamando al método Match del objeto IRouteConstraint. El método Match devuelve un valor booleano que indica si el valor de parámetro es válido.

En el siguiente ejemplo, se muestra cómo utilizar el método MapPageRoute para crear una ruta con restricciones que limitan los valores que se pueden incluir en los parámetros year y locale. (En una aplicación de MVC, se usaría el método MapRoute.)

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx",
        true,
        new RouteValueDictionary 
            {{"categoryName", "food"}, {"action", "show"}},
        new RouteValueDictionary 
            {{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}}
       );
}

Cuando el enrutamiento controla una solicitud URL, la definición de ruta mostrada en el ejemplo anterior genera los resultados que se enumeran en la tabla siguiente.

URL

Resultado

/US

Ninguna coincidencia. Se requieren las plantillas locale y year.

/US/08

Ninguna coincidencia. La restricción en year requiere 4 dígitos.

/US/2008

locale = "US"

year = "2008"

En algunas circunstancias, el enrutamiento de ASP.NET no controla una solicitud, ni siquiera si está habilitado para el sitio web. En esta sección, se describen algunos escenarios en los que el enrutamiento no controla la solicitud.

Se encuentra un archivo físico que se corresponde con el modelo de dirección URL

De forma predeterminada, el enrutamiento no controla solicitudes que se asignan a un archivo físico existente en el servidor web. Por ejemplo, el enrutamiento no controla una solicitud de http://server/application/Products/Beverages/Coffee.aspx si existe un archivo físico en Products/Beverages/Coffee.aspx. El enrutamiento no controla la solicitud, ni siquiera si se corresponde con un modelo definido, como {controller}/{action}/{id}.

Si desea que el enrutamiento controle todas las solicitudes, incluso las que apuntan a archivos, puede reemplazar el comportamiento predeterminado estableciendo la propiedad RouteExistingFiles del objeto RouteCollection en true. Al establecer este valor en true, el enrutamiento controla todas las solicitudes que coincidan con un modelo definido.

El enrutamiento está explícitamente deshabilitado para un modelo de dirección URL

También puede especificar que el enrutamiento no controle ciertas solicitudes URL. Para evitar que el enrutamiento controle ciertas solicitudes, defina una ruta y especifique que se debería usar la clase StopRoutingHandler para controlar dicho modelo. Cuando un objeto StopRoutingHandler controla una solicitud, el objeto StopRoutingHandler bloquea cualquier procesamiento adicional de la solicitud como una ruta. En lugar de esto, la solicitud se procesa como una página o servicio Web ASP.NET, o como otro extremo ASP.NET. Se puede usar el método RouteCollection.Ignore (o RouteCollectionExtensions.IgnoreRoute para las aplicaciones de MVC) para crear rutas que usen la clase StopRoutingHandler. En el ejemplo siguiente, se muestra cómo evitar que el enrutamiento controle las solicitudes del archivo WebResource.axd.

public static void RegisterRoutes(RouteCollection routes)
{
  routes.Ignore("{resource}.axd/{*pathInfo}");
}

Cuando el enrutamiento controla solicitudes URL, intenta comparar la dirección URL de la solicitud con una ruta. La comparación de una solicitud URL con una ruta depende de todas las condiciones siguientes:

  • Los modelos de ruta que ha definido o los modelos de ruta predeterminados, si los hubiera, incluidos en el tipo de proyecto.

  • El orden en que los agregó a la colección Routes.

  • Cualquier valor predeterminado que haya proporcionado para una ruta.

  • Cualquier restricción que haya proporcionado para una ruta.

  • Si ha definido el enrutamiento para controlar solicitudes que coinciden con un archivo físico.

Para evitar que el controlador equivocado administre una solicitud, debe tener en cuenta todas estas condiciones al definir rutas. El orden en que aparecen los objetos Route en la colección Routes es importante. La comparación de las rutas se realiza desde la primera a la última ruta de la colección. Cuando existe una coincidencia , no se evalúan más rutas. En general, agregue rutas a la propiedad Routes en orden de más específica a menos específica para las definiciones de ruta.

Por ejemplo, suponga que agrega rutas con los modelos siguientes:

  • La Ruta 1 está establecida en {controller}/{action}/{id}

  • La Ruta 2 está establecida en products/show/{id}

La Ruta 2 nunca controlará una solicitud porque se evalúa primero la Ruta 1, y siempre coincidirá con solicitudes que también podrían funcionar para la Ruta 2. Una solicitud de http://server/application/products/show/bikes parece coincidir con mayor exactitud con la Ruta 2, pero la Ruta 1 se controla con los siguientes valores:

  • controller es products.

  • action es show.

  • id es bikes.

Se utilizan los valores predeterminados si falta un parámetro en la solicitud. Por consiguiente, pueden hacer que una ruta coincida con una solicitud inesperada. Por ejemplo, suponga que agrega rutas con los modelos siguientes:

  • Ruta 1: {report}/{year}/{month}, con los valores predeterminados de year y month.

  • Ruta 2: {report}/{year}, con un valor predeterminado para year.

La Ruta 2 nunca controlará una solicitud. La Ruta 1 podría estar destinada a un informe mensual y la Ruta 2 podría estar destinada a un informe anual. Sin embargo, los valores predeterminados de la Ruta 1 significan que coincidirá con cualquier solicitud que pueda funcionar también para la Ruta 2.

Puede evitar la ambigüedad de los modelos incluyendo constantes, como annual/{report}/{year} y monthly/{report}/{year}/{month}.

Si una dirección URL no coincide con ningún objeto Route definido en la colección RouteTable, el enrutamiento de ASP.NET no procesará la solicitud. En lugar de esto, el procesamiento se pasa a una página ASP.NET, servicio Web u otro extremo ASP.NET.

Si desea crear hipervínculos a las páginas de un sitio, puede utilizar los modelos de dirección URL para crear mediante programación direcciones URL que correspondan a las rutas. Si se cambian los modelos, se generarán automáticamente direcciones URL que se correspondan con los nuevos modelos. Para obtener información sobre cómo generar direcciones URL en código o en marcado, vea Cómo: Crear direcciones URL a partir de rutas.

En el controlador de una solicitud de página enrutada, se puede obtener acceso a los valores que se pasan en los marcadores de posición de la dirección URL mediante código o marcado. Para obtener más información, vea Cómo: Obtener acceso a parámetros URL en una página enrutada.

Para las aplicaciones de MVC, el marco de MVC controla automáticamente los valores que se pasan en los marcadores de posición de la dirección URL. Para obtener más información, vea Pasar datos en una aplicación ASP.NET MVC.

Las reglas de autorización se pueden aplicar solo a la dirección URL de ruta o tanto a la dirección URL de ruta como a la dirección URL física a la que está asignada. Por ejemplo, las reglas de autorización podrían especificar que todos los usuarios pueden obtener acceso a las direcciones URL que comiencen con Category pero que solo los administradores pueden obtener acceso a la página Categories.aspx. Si el modelo de dirección URL de ruta contoso.com/Category/{controller}/{action} se corresponde con la dirección URL física contoso.com/Categoriespage.aspx y se aplican las reglas de autorización únicamente a la dirección URL de ruta, todos los usuarios podrán obtener acceso a Categoriespage.aspx si se realiza la solicitud usando una dirección URL de ruta. Sin embargo, solo los administradores tendrán acceso a dicha página si la solicitud se realiza usando una dirección URL física.

De forma predeterminada, las reglas de autorización se aplican a la dirección URL de ruta y a la dirección URL física. Para obtener más información, vea la propiedad PageRouteHandler.CheckPhysicalUrlAccess.

En la tabla siguiente figuran las principales clases de servidor para el enrutamiento de ASP.NET.

Clase

Descripción

Route

Representa una ruta en una aplicación de formularios Web Forms o de MVC.

DynamicDataRoute

Representa una ruta en una aplicación de datos dinámicos.

RouteBase

Actúa como clase base para todas las clases que representan una ruta de ASP.NET.

RouteTable

Almacena las rutas de una aplicación.

RouteCollection

Proporciona métodos que permiten administrar una colección de rutas.

RouteCollectionExtensions

Proporciona métodos adicionales que permiten administrar una colección de rutas en aplicaciones de MVC.

RouteData

Contiene los valores de una ruta solicitada.

RequestContext

Contiene información sobre la solicitud HTTP correspondiente a una ruta.

StopRoutingHandler

Proporciona una manera de especificar que el enrutamiento de ASP.NET no debería administrar las solicitudes de un modelo de dirección URL.

PageRouteHandler

Permite definir rutas para las aplicaciones de formularios Web Forms.

RouteValueDictionary

Permite almacenar los objetos Constraints, Defaults y DataTokens de las rutas.

VirtualPathData

Permite generar direcciones URL a partir de información de las rutas.

El enrutamiento de ASP.NET se difiere de la reescritura de direcciones URL. La reescritura de direcciones URL procesa las peticiones entrantes cambiando realmente la dirección URL antes de enviar la solicitud a la página web. Por ejemplo, una aplicación que utiliza la reescritura de direcciones URL podría cambiar una dirección URL de /Products/Widgets/ a /Products.aspx?id=4. Asimismo, la reescritura de direcciones URL normalmente no tiene una API para crear direcciones URL basadas en sus modelos. En la reescritura de direcciones URL, si cambia un modelo de dirección URL, deberá actualizar manualmente todos los hipervínculos que contengan la dirección URL original.

Con el enrutamiento de ASP.NET, la dirección URL no se cambia cuando se controla una solicitud entrante, porque el enrutamiento puede extraer valores de la dirección URL. Si tiene que crear una dirección URL, pase los valores del parámetro a un método que genere la dirección URL para usted. Para cambiar el modelo de dirección URL, cámbielo en una ubicación y todos los vínculos que cree en la aplicación basada en dicho modelo utilizarán automáticamente el nuevo modelo.

¿Te ha resultado útil?
(Caracteres restantes: 1500)

Adiciones de comunidad

AGREGAR
© 2013 Microsoft. Reservados todos los derechos.