Cómo usar el enrutamiento de atributos en ASP.NET Core

El middleware de enrutamiento en ASP.NET Core es experto en asignar solicitudes entrantes a los respectivos controladores de ruta. Puede configurar el enrutamiento en ASP.NET Core de dos formas diferentes: enrutamiento basado en atributos y enrutamiento basado en convenciones.

A diferencia del enrutamiento basado en convenciones, en el que la información de enrutamiento se especifica en una única ubicación, el enrutamiento de atributos le permite implementar el enrutamiento decorando sus métodos de acción con atributos. Este artículo presenta una discusión sobre cómo podemos trabajar con el enrutamiento basado en atributos en ASP.NET Core MVC.

Para trabajar con los ejemplos de código proporcionados en este artículo, debe tener Visual Studio 2019 instalado en su sistema. Si aún no tiene una copia, puede descargar Visual Studio 2019 aquí. 

Crear un proyecto MVC de ASP.NET Core 3.1 en Visual Studio 2019

En primer lugar, creemos un proyecto ASP.NET Core en Visual Studio 2019. Suponiendo que Visual Studio 2019 esté instalado en su sistema, siga los pasos que se describen a continuación para crear un nuevo proyecto ASP.NET Core en Visual Studio.

  1. Inicie el IDE de Visual Studio.
  2. Haga clic en "Crear nuevo proyecto".
  3. En la ventana "Crear nuevo proyecto", seleccione "Aplicación web ASP.NET Core" de la lista de plantillas que se muestra.
  4. Haga clic en Siguiente.
  5. En la ventana "Configure su nuevo proyecto", especifique el nombre y la ubicación del nuevo proyecto.
  6. Opcionalmente, marque la casilla de verificación “Colocar la solución y el proyecto en el mismo directorio”, según sus preferencias.
  7. Haga clic en Crear.
  8. En la ventana "Crear una nueva aplicación web ASP.NET Core" que se muestra a continuación, seleccione .NET Core como tiempo de ejecución y ASP.NET Core 3.1 (o posterior) de la lista desplegable en la parte superior.
  9. Seleccione "Aplicación web (Modelo-Vista-Controlador)" como plantilla de proyecto para crear una nueva aplicación ASP.NET Core MVC. 
  10. Asegúrese de que las casillas de verificación "Habilitar compatibilidad con Docker" y "Configurar para HTTPS" no estén marcadas, ya que no usaremos esas funciones aquí.
  11. Asegúrese de que la autenticación esté configurada en "Sin autenticación", ya que tampoco usaremos autenticación.
  12. Haga clic en Crear.

Si sigue estos pasos, se creará un nuevo proyecto ASP.NET Core MVC en Visual Studio 2019. Usaremos este proyecto en las secciones siguientes para ilustrar cómo podemos trabajar con el enrutamiento de atributos en ASP.NET Core 3.1.

Cree una clase de controlador en ASP.NET Core MVC

Cree un nuevo controlador llamado DefaultController y reemplace el código fuente predeterminado de DefaultController con el siguiente código:

    clase pública DefaultController: Controlador

    {

        [Ruta("")]

        [Ruta ("Predeterminado")]

        [Ruta ("Predeterminado / Índice")]

        Índice de resultado de acción público ()

        {

            return new EmptyResult ();

        }

        [Ruta ("Predeterminado / GetRecordsById / {id}")]

        public ActionResult GetRecordsById (int id)

        {

            string str = string.Format

            ("La identificación pasada como parámetro es: {0}", identificación);

            volver Ok (str);

        }

    }

Use el enrutamiento de atributos en el nivel del controlador en ASP.NET Core

El enrutamiento de atributos se puede utilizar tanto a nivel del controlador como del método de acción. Si aplicamos el atributo de ruta a nivel del controlador, entonces la ruta es aplicable a todos los métodos de acción de ese controlador.

Si examina nuestra clase DefaultController, observará que la ruta predeterminada se usa varias veces al especificar la plantilla de ruta para los métodos de acción. El siguiente fragmento de código muestra cómo se pueden especificar diferentes atributos de ruta en el nivel del controlador para hacer un uso más flexible del enrutamiento de atributos.

[Ruta ("Predeterminado")]   

clase pública DefaultController: Controlador

{

  [Ruta("")]

  [Ruta ("Índice")]

  Índice de resultado de acción público ()

  {

      return new EmptyResult ();

   }

  [HttpGet]

  Ruta ("Predeterminado / GetRecordsById / {id}")]

  public ActionResult GetRecordsById (int id)

  {

      string str = string.Format ("La identificación pasada como parámetro es: {0}", id);

      volver Ok (str);

   }

}

Cuando se utilizan atributos de ruta tanto en el nivel del controlador como en el método de acción, la plantilla de ruta aplicada al nivel del controlador se antepone a la plantilla de ruta especificada en el nivel del método de acción.

A menudo, es posible que necesite un prefijo común para su controlador. Cuando lo haga, debe usar el atributo [RoutePrefix] como se muestra en el fragmento de código que se proporciona a continuación.

[RoutePrefix ("servicios")]

HomeController de clase pública: Controlador

{

   // Métodos de acción

}

Use el enrutamiento de atributos en el nivel del método de acción en ASP.NET Core

Consulte la clase DefaultController que se muestra arriba. Como puede ver, hemos especificado tres rutas en el método Index de la clase DefaultController. Esto implica que cada una de las siguientes URL invocará el método de acción Index () del DefaultController.

// localhost: 11277

// localhost: 11277 / inicio

// localhost: 11277 / home / index

Al igual que en el enrutamiento basado en convenciones, también puede especificar parámetros en el enrutamiento basado en atributos. En otras palabras, el enrutamiento basado en atributos le permite especificar atributos de ruta con parámetros. El método de acción GetRecordsById de la clase DefaultController que se mostró anteriormente es un ejemplo.

Tenga en cuenta que "{id}" en la ruta especificada representa un parámetro o un marcador de posición. El parámetro id en este ejemplo puede ser cualquier cosa, como una cadena o un número entero. ¿Qué sucede si desea restringir el parámetro a solo números enteros? Puede lograr esto utilizando restricciones.

Usar restricciones de ruta de atributo en un método de acción

Las restricciones de ruta se utilizan para frustrar solicitudes no válidas de acciones del controlador. Por ejemplo, es posible que desee asegurarse de que el parámetro pasado a un método de acción sea siempre un número entero. La sintaxis del uso de restricciones de ruta es {parámetro: restricción}. El siguiente fragmento de código ilustra esto. Tenga en cuenta que el parámetro id aquí es siempre un número entero.

[Ruta ("Predeterminado / GetRecordsById / {id: int}")]

public ActionResult GetRecordsById (int id)

{

  string str = string.Format ("La identificación pasada como parámetro es: {0}", id);

  volver Ok (str);

}

Utilice parámetros opcionales en las especificaciones de ruta de atributos

También puede utilizar parámetros opcionales en la especificación de su ruta. El siguiente fragmento de código muestra cómo se puede lograr. Tenga en cuenta que el método de acción en este caso se ejecutaría incluso si no se pasa el parámetro id.

[Ruta ("Sales / GetSalesByRegionId / {id?}")]

Es importante comprender que cuando se usa el enrutamiento de atributos, ni el nombre del controlador ni el nombre del método de acción juegan ningún papel en la selección del método de acción que se ejecutará. Veamos esto con un ejemplo. El siguiente fragmento de código ilustra cómo se ha cambiado la URL en la especificación de ruta para el método de acción GetRecordsById.

[Ruta ("Inicio / GetRecordsById / {id: int}")]

public ActionResult GetRecordsById (int id)

{

   string str = string.Format ("La identificación pasada como parámetro es: {0}", id);

   volver Ok (str);

}

Ahora puede invocar el método de acción GetRecordsById utilizando la siguiente URL:

// localhost: 11277 / home / GetRecordsById / 1

Usar múltiples restricciones de ruta de atributos en un método de acción

También es posible aplicar múltiples restricciones a un parámetro. El siguiente fragmento de código ilustra cómo se puede lograr. Tenga en cuenta que el valor mínimo del parámetro id debe ser 1; de lo contrario, se devolverá un error 404.

[Ruta ("Predeterminado / GetRecordsById / {id: int: min (1)}")]

public ActionResult GetRecordsById (int id)

{

    string str = string.Format ("La identificación pasada como parámetro es: {0}", id);

    volver Ok (str);

}

Utilice verbos HTTP en rutas de atributos en un método de acción

Incluso puede utilizar verbos HTTP en el enrutamiento de atributos. El siguiente fragmento de código muestra cómo se puede lograr.

[HttpGet]

[Ruta ("Predeterminado / GetRecordsById / {id: int: min (1)}")]

public ActionResult GetRecordsById (int id)

{

  string str = string.Format ("La identificación pasada como parámetro es: {0}", id);

  volver Ok (str);

}

Restricciones de ruta de atributos de uso común 

A continuación, se muestra una lista de las restricciones de ruta más utilizadas en ASP.NET Core. 

  • bool - usado para coincidir con un valor booleano
  • fecha y hora: se usa para coincidir con un valor de fecha y hora
  • decimal: se utiliza para coincidir con un valor decimal
  • doble: se utiliza para hacer coincidir un valor de punto flotante de 64 bits
  • float: se usa para hacer coincidir un valor de punto flotante de 32 bits
  • guid: se usa para coincidir con un valor GUID
  • int - usado para hacer coincidir un valor entero de 32 bits
  • long: se usa para hacer coincidir un valor entero de 64 bits
  • max: se usa para hacer coincidir un número entero con un valor máximo
  • min: se usa para hacer coincidir un número entero con un valor mínimo
  • minlength: se utiliza para hacer coincidir una cadena con una longitud mínima
  • regex - usado para coincidir con una expresión regular

Crear restricciones de ruta de atributos personalizados 

También puede crear sus propias restricciones de ruta personalizadas creando una clase que amplíe la interfaz IRouteConstraint e implemente el método Match como se muestra en el fragmento de código que se proporciona a continuación.

clase pública CustomRouteConstraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, ruta IRouter,

        cadena routeKey,

        RouteValueDictionary valores, RouteDirection routeDirection)

        {

            lanzar nueva NotImplementedException ();

        }

    }

Utilice el reemplazo de tokens en rutas de atributos a nivel de controlador

El enrutamiento de atributos en ASP.NET Core MVC proporciona compatibilidad con otra característica interesante llamada reemplazo de token. Puedes usar los tokens [acción], [área] y [controlador] en tu controlador, y estos tokens serán reemplazados por los nombres de acción, área y controlador respectivamente. El siguiente fragmento de código ilustra cómo se puede lograr.

[Ruta ("[controlador] / [acción]")]

HomeController de clase pública: Controlador

{

   ILogger _logger privado de solo lectura;

   Public HomeController (registrador ILogger)

   {

       _logger = registrador;

   }

   índice IActionResult público ()

   {

       volver Ver ();

   }

   // Otros métodos de acción

}

El enrutamiento de atributos en ASP.NET Core le brinda más control y flexibilidad sobre los URI en su aplicación web. Aunque el enrutamiento basado en convenciones se puede configurar en una única ubicación, que a su vez se puede aplicar a todos los controladores de su aplicación, es difícil admitir ciertos patrones de URI (como el control de versiones de API) con el enrutamiento basado en convenciones.

Al utilizar el enrutamiento de atributos, puede desacoplar el controlador y los nombres de las acciones de la plantilla de ruta. Incluso puede usar una combinación de enrutamiento basado en convenciones y enrutamiento basado en atributos en sus aplicaciones ASP.NET Core.

Cómo hacer más en ASP.NET Core:

  • Cómo pasar parámetros a métodos de acción en ASP.NET Core MVC
  • Cómo usar los analizadores de API en ASP.NET Core
  • Cómo usar tokens de datos de ruta en ASP.NET Core
  • Cómo usar el control de versiones de API en ASP.NET Core
  • Cómo usar objetos de transferencia de datos en ASP.NET Core 3.1
  • Cómo manejar errores 404 en ASP.NET Core MVC
  • Cómo usar la inyección de dependencia en filtros de acción en ASP.NET Core 3.1
  • Cómo usar el patrón de opciones en ASP.NET Core
  • Cómo usar el enrutamiento de punto final en ASP.NET Core 3.0 MVC
  • Cómo exportar datos a Excel en ASP.NET Core 3.0
  • Cómo usar LoggerMessage en ASP.NET Core 3.0
  • Cómo enviar correos electrónicos en ASP.NET Core
  • Cómo registrar datos en SQL Server en ASP.NET Core
  • Cómo programar trabajos usando Quartz.NET en ASP.NET Core
  • Cómo devolver datos de ASP.NET Core Web API
  • Cómo formatear los datos de respuesta en ASP.NET Core
  • Cómo consumir una API web ASP.NET Core con RestSharp
  • Cómo realizar operaciones asíncronas usando Dapper
  • Cómo usar marcas de características en ASP.NET Core
  • Cómo usar el atributo FromServices en ASP.NET Core
  • Cómo trabajar con cookies en ASP.NET Core
  • Cómo trabajar con archivos estáticos en ASP.NET Core
  • Cómo utilizar Middleware de reescritura de URL en ASP.NET Core
  • Cómo implementar la limitación de velocidad en ASP.NET Core
  • Cómo usar Azure Application Insights en ASP.NET Core
  • Uso de funciones avanzadas de NLog en ASP.NET Core
  • Cómo manejar errores en ASP.NET Web API
  • Cómo implementar el manejo de excepciones global en ASP.NET Core MVC
  • Cómo manejar valores nulos en ASP.NET Core MVC
  • Control de versiones avanzado en ASP.NET Core Web API
  • Cómo trabajar con servicios de trabajador en ASP.NET Core
  • Cómo usar la API de protección de datos en ASP.NET Core
  • Cómo usar middleware condicional en ASP.NET Core
  • Cómo trabajar con el estado de la sesión en ASP.NET Core
  • Cómo escribir controladores eficientes en ASP.NET Core