Saltar al contenido

ASP.NET Core desmitificado: enrutamiento en MVC: excepción no encontrada

ÁSPID.NET Core MVC ha introducido bastantes conceptos que son nuevos (o nuevos enÁSPID.NET) los desarrolladores web pueden tener algunas dificultades para ponerse al día. Mi ÁSPIDLa serie .NET Core Demystified está diseñada para ayudar a estos desarrolladores a comenzar a crear su propia A personalizada, completa y funcional.ÁSPIDAplicaciones .NET Core.

En esta parte de la serie, veremos el concepto de enrutamiento y cómo podemos usarlo para hacer coincidir las URL con las acciones. Como siempre con mis tutoriales, hay un proyecto de muestra en GitHub, así que echa un vistazo a ese código y ven conmigo mientras exploramos el enrutamiento en ÁSPID.NET Core!

Enrutamiento es un término general usado en ÁSPID.NET Core para un sistema que toma direcciones URL y las asigna a acciones, archivos u otros elementos del controlador. Dicho sistema implica el uso de clases denominadas controladores de ruta, que hacen el mapeo real. La mayoría de las veces, no creará rutas a un nivel tan bajo (por ejemplo, creando controladores de ruta). más bien estarás definiendo rutas y contando ÁSPID.NET Core donde se asignan esas rutas.

Hay dos formas principales de definir rutas:

Los dos sistemas de enrutamiento pueden coexistir en el mismo sistema. Veamos primero el enrutamiento basado en convenciones.

Enrutamiento basado en convenciones

En el enrutamiento basado en convenciones, usted define una serie de convenciones de ruta que están destinadas a representar todas las rutas posibles en su sistema. Dichas definiciones se encuentran en el archivo Startup.cs de usted. ÁSPIDProyecto .NET Core. Por ejemplo, veamos cuál podría ser la ruta basada en convenciones más simple posible para una ÁSPIDAplicación .NET Core MVC:

Esta ruta espera, y mapeará, URL como las siguientes:

Sin embargo, ¿y si quisiéramos tener rutas más específicas? Diga, así:

Para que nuestras acciones coincidan con esas URL, debemos agregar algunas características a nuestras rutas basadas en convenciones.

Restricciones de ruta

Digamos que queremos hacer coincidir la siguiente URL:

Una forma sencilla de hacer esto podría ser definir la siguiente ruta:

Esto, de hecho, coincidirá con la ruta deseada, pero también coincidirá con lo siguiente:

Probablemente esto no sea lo que queremos. En las URL anteriores, los valores “todos”, “primero” y “muchos” se asignarán a los valores de una acción. id parámetro.

Si queremos el id para ser solo un número entero, podríamos introducir un restricción de ruta, al igual que:

La {id:int} especifica que lo que esté en esta parte de la URL debe ser un número entero; de lo contrario, la URL no se asigna a esta ruta.

Hay toneladas de posibles restricciones de ruta que puede usar, que incluyen:

También hay varios otros; puede encontrarlos todos en la página de documentos de enrutamiento de ASP.NET Core.

Parámetros opcionales

También es posible que queramos asignar las siguientes URL a la misma acción:

Para hacer esto, podemos usar parámetros opcionales en nuestras rutas basadas en convenciones agregando un ? a la restricción del parámetro opcional, así:

NOTA: Solo puede tener un parámetro opcional por ruta, y ese parámetro opcional debe ser el último parámetro.

Valores predeterminados

Además de las restricciones de ruta y los parámetros opcionales, también podemos especificar qué sucede si no se proporcionan partes de la ruta. Digamos que encontramos esta URL:

Queremos mapear esta URL al controlador. home y acción index, por lo que introducimos valores de ruta predeterminados definiendo la siguiente ruta:

Esto ahora enrutará correctamente la URL a nuestra acción Inicio / Índice. También podríamos mapear valores predeterminados usando un defaults propiedad:

Rutas nombradas

También podemos proporcionar un nombre para cualquier ruta determinada. Nombrar una ruta nos permite tener múltiples rutas con parámetros similares pero que se pueden usar de manera diferente. Los nombres deben ser únicos en todo el proyecto.

Rutas de muestra

Como siempre con mis publicaciones de tutoriales, he incluido un proyecto de muestra en GitHub. En ese proyecto, definimos las siguientes rutas basadas en convenciones:

Enrutamiento de atributos

A diferencia del enrutamiento basado en convenciones, el enrutamiento de atributos nos permite definir qué ruta va a cada acción mediante el uso de atributos en dichas acciones. Si solo está utilizando enrutamiento basado en convenciones, no es necesario emplear enrutamiento de atributos en absoluto. Sin embargo, muchas personas (incluido yo mismo) creen que el enrutamiento de atributos proporciona una mejor relación entre acciones y rutas y un control más detallado sobre las rutas.

Este es el uso más simple posible del enrutamiento de atributos:

NOTA: En ÁSPID.NET Core MVC, los atributos [HttpGet], [HttpPost] y se pueden utilizar atributos similares para asignar rutas.

Reemplazo de token

Una de las cosas ÁSPID.NET Core MVC hace que el enrutamiento sea un poco más flexible es proporcionar tokens para [area], [controller], y [action]. Estos tokens se reemplazan por sus valores de acción en la tabla de ruta. Por ejemplo, si tenemos el siguiente controlador:

Si hay dos acciones, índice y vista, en este controlador, sus rutas son ahora:

Por lo tanto, el reemplazo de token proporciona una forma breve de incluir el controlador, el área y los nombres de la acción en la ruta.

Varias rutas

El enrutamiento de atributos, debido a que se enfoca en las acciones individuales, permite mapear múltiples rutas a la misma acción o controlador. Una de las formas más comunes de hacer esto es definir rutas predeterminadas, así:

El tres [HttpGet] Los atributos definen que la acción coincide con las siguientes rutas:

Puedes definir tantas rutas como quieras para cada acción o controlador.

Enrutamiento mixto

Es perfectamente válido utilizar enrutamiento basado en convenciones para algunos controladores y acciones y enrutamiento de atributos para otros. Sin emabargo, ÁSPID.NET Core MVC no permite que existan rutas basadas en convenciones y enrutamiento de atributos en la misma acción. Si una acción usa enrutamiento de atributos, ninguna ruta basada en convenciones puede mapear esa acción. Consulte los documentos de ASP.NET Core para obtener más información.

Si no necesita mi pequeña opinión alegre sobre el enrutamiento, pase a la siguiente sección.

¿Se han ido? Bien.

¡Ruta de atributos todas las cosas! En serio, el enrutamiento de atributos es mucho más poderoso que el enrutamiento basado en convenciones. El enrutamiento basado en convenciones es bueno para archivos estáticos y similares, pero si necesita asignar una acción a una ruta, utilice el enrutamiento de atributos.

En ÁSPID.NET Core MVC, el enrutamiento es el sistema mediante el cual las URL se asignan a las acciones del controlador y otros recursos. Hay dos métodos principales para crear rutas: enrutamiento basado en convenciones, que define algunas rutas en el archivo Startup.cs, y enrutamiento de atributos, que define una ruta por acción. Puede mezclar los dos estilos, pero si una acción tiene una ruta de atributo, no se puede alcanzar mediante una ruta basada en convenciones.

Como siempre, hay un proyecto de muestra en GitHub que demuestra muchas de las características de enrutamiento de las que se habló en esta publicación. ¡Échale un vistazo! Además, siéntase libre de compartir en los comentarios cualquier cosa útil de las funciones de Enrutamiento de ÁSPID.NET Core que aún no cubrí.

Esta publicación está destinada a ser una demostración de nivel introductorio al concepto de enrutamiento, al tiempo que elimina el cruft en la documentación oficial de Microsoft. Está destinado a mostrar los usos más comunes, no todos. Dicho esto, si crees que me perdí algo que debería estar aquí, ¡házmelo saber en los comentarios!

¡Feliz codificación!

Este contenido se publicó originalmente aquí.