Enrutamiento Restful para ASP.NET MVC, basado en el enrutamiento DSL de Ruby on Rails. Utliza verbos HTTP para mantener las rutas únicas al mínimo, a la vez que optimiza la estructura de los controladores.

PM > Install-Package RestfulRouting

Bienvenido a Restful Routing para ASP.NET ¡MVC! El enrutamiento es posiblemente el núcleo de todos ASP.Net Aplicaciones MVC. Administrar las rutas por sí mismo puede ser engorroso, frustrante e improductivo. Algunos desarrolladores utilizan una ruta general, que puede provocar problemas inesperados a medida que crece la aplicación. El enrutamiento Restful resuelve el problema de administración de enrutamiento al proporcionar una interfaz obstinada de registro de rutas.

Esperamos que encuentre que esta biblioteca es tan fácil de usar que se preguntará cómo se desarrolló ASP.Net Aplicaciones MVC sin it.

Golden Seven

El enrutamiento Restful se basa en la idea de Resources y las acciones Golden Seven:

la Acción HTTP Método
ÍNDICE OBTENER
MOSTRAR OBTENER
CREAR POST
NUEVO OBTENER
EDITAR OBTENER
ACTUALIZACIÓN PONER
DESTRUIR ELIMINAR

El objetivo del Descanso de Enrutamiento es hacer que usted consciente de sus controladores. Si bien puede doblar las reglas cuando sea apropiado, realmente debe concentrarse en mantener a todos los controladores limitados a estas siete acciones. Si lucha contra las convenciones de Enrutamiento Tranquilo, no aprovechará la fuerza de nuestro marco de trabajo obstinado y será miserable al hacerlo.

Ruta predeterminada

Antes de sumergirme en el Enrutamiento Restful, me gustaría discutir la ruta predeterminada proporcionada por ASP.NET MVC. Se encuentra en muchas plantillas de inicio, es una herramienta útil para comenzar, pero no recomiendo usarlo para ningún entorno de producción. Enumeraré las razones a continuación:

  • Cualquier controlador de su proyecto será accesible incluso si no está registrado con un marco de enrutamiento como Enrutamiento Restful.
  • Puede dar lugar a una resolución de ruta de salida inesperada y horas de depuración.

Paso 1. Instalación de enrutamiento Restful

Para comenzar, asumiremos que está comenzando con un enrutamiento existente ASP.Net Proyecto MVC y entender cómo llegar a ese punto.

Abra la consola del Administrador de paquetes y escriba lo siguiente:PM> Install-Package RestfulRouting.

Si no desea utilizar la Consola del Administrador de paquetes, puede hacer clic con el botón derecho en su proyecto web y seleccionar el elemento del menú contextual «Administrar paquetes Nuget». Buscar RestfulRouting instalar el paquete.

Paso 2. Configuración de enrutamiento Restful

Un par de cambios deberían haber ocurrido en su proyecto, a saber, se agregaron dos archivos: Routes.cs y ApplicationController.

Routes.cs debería parecerse a la sección de la derecha. Tenemos un poco de ayuda ya incluida en este archivo. No todo el mundo está escribiendo una aplicación de blog, así que siéntete libre de borrar el código comentado después de haberlo revisado.

Tenga en cuenta la dependencia de WebActivator, esto asegurará que las rutas se registren cuando se inicie su aplicación. Puede elegir eliminar esta dependencia si prefiere llamar al método Start usted mismo.

// setting the root routemap.Root<HomeController>(x => x.Index());

Para su configuración, asegúrese de establecer el Root;

Además de Routes.cs, también obtendrá ApplicationController. El uso de este controlador base es opcional, pero tiene el código necesario para utilizar los resultados de formato

Paso 3. Ver Configuración del motor (Opcional)

ASP.Net MVC depende de los motores de vista para localizar las vistas. Si bien el motor de vista predeterminado está bien, encontramos que la estructura de carpetas es un poco detallada. Si desea utilizar nuestros motores de visión, cambie su Global.archivo asax para que se vea como el siguiente.

Ahí Lo Tienes. Código! Código! Código!

Si quieres saber más sobre cómo y qué está pasando en el registro de tus rutas sigue leyendo.

RouteSet

En esta sección, aprenderá sobre RouteSet. La clase es fundamental para hacer que el enrutamiento sea reparador.

Lo básico

Un conjunto de rutas es una colección de asignaciones de rutas. No solo define rutas en su aplicación, sino que también puede conectarse a otros conjuntos de rutas, creando un conjunto completo de rutas con un esfuerzo mínimo.

Todas las rutas se definen dentro del método Map de un conjunto de rutas.

La instancia de IMapper pasada a Map presenta una forma de mapear sus rutas al diccionario RouteTable en el corazón de cada ASP.Net Aplicación MVC. Si ha instalado Enrutamiento Restful a través de Nuget, habrá notado un conjunto de rutas ya creado para usted.

Conectando

A veces desea separar lógicamente sus conjuntos de rutas. En lugar de agrupar todas las rutas en un solo conjunto de rutas, ofrecemos la posibilidad de conectar conjuntos de rutas. Debe seleccionar un conjunto de rutas para que sea la raíz de sus conjuntos de rutas, después de lo cual puede conectar otros conjuntos de rutas de la manera que desee. Los conjuntos de rutas también admiten espacios de nombres, similares a las áreas.

Configuración (Opcional)

Un conjunto de rutas proporciona configuraciones que pueden modificar el comportamiento del registro de rutas. Estas propiedades se pueden encontrar en el contexto de un conjunto de rutas. La mayoría de los desarrolladores no querrán tocar estas características.

Ajuste por Defecto Resultado
LowercaseUrls true registro de direcciones url en minúsculas invariante de la cultura
LowercaseDefaults true registro de sus acciones cuando se registra normalmente en minúsculas invariante de la cultura
LowercaseActions true registro de sus acciones, cuando se registren, con la Ruta en minúsculas invariante de la cultura
MapDelete false registrar una acción adicional de Suprimir . Se usa para mostrar una página de confirmación de eliminación antes de eliminar un recurso.

Mapeo

El enrutamiento Restful es un marco de mapeo, y para hacer el mapeo proporcionamos un conjunto de conceptos e interfaces. Lea sobre cada interfaz a continuación y qué funcionalidad proporciona cada una en detalle.

Root

map.Root<HomeController>(x => x.Index());

Cada aplicación necesita una página predeterminada, y registrar una ruta de acceso raíz nunca ha sido tan fácil. Si su aplicación estaba alojada en , entonces se consideraría la raíz.

Es posible que su aplicación solo tenga una raíz.

Recurso

map.Resource<ProfileController>();

Un recurso es una «cosa» que se puede pensar de forma singular desde la perspectiva del usuario de la aplicación. Un perfil para un usuario autenticado es un buen ejemplo de recurso. Echa un vistazo a la siguiente url. Cuando se trata de un perfil, obtendrá el identificador a través de una cookie (u otros medios implícitos), y no necesita el identificador en la ruta de la ruta.

La url asume que la aplicación sabe qué es un perfil y cómo presentarlo. Ahora, ¿cómo se vería el registro en un conjunto de rutas?

Acciones y métodos Http

Al registrar un recurso, se registra automáticamente un conjunto de acciones y métodos. Registre su controlador e implemente las acciones.

la Acción HTTP Método
MOSTRAR OBTENER
CREAR POST
NUEVO OBTENER
EDITAR OBTENER
ACTUALIZACIÓN PONER
DESTRUIR ELIMINAR

Para nuestro ejemplo con el ProfileController, se obtiene el siguiente resultado:

la Acción HTTP Método Resultado (controlador#acción) Url
MOSTRAR GET perfil de#show /perfil
NUEVO GET perfil de#new /perfil/nuevo
CREAR POST perfil de#create /perfil
EDITAR GET perfil de#editar /perfil/editar
ACTUALIZACIÓN PONER perfil de#update / perfil
DESTRUIR ELIMINAR perfil # destruir /perfil

Nombrar

A veces nombras a tu controlador una cosa, pero deseas que la url del recurso refleje otra cosa. Esto es fácil de hacer.

La nueva url para profile#show se cambiará a

Additionally, you can change the default action names of a resource by using the PathNames método. Esto no es recomendable, pero nos gusta darle opciones.

Elegir acciones

A veces es posible que no necesite todos los métodos que proporcionamos para un recurso. Imagine los siguientes ejemplos:

  • Como usuario, no debería poder crear un perfil, porque se crea implícitamente cuando nos registramos.
  • Como usuario, debería poder editar mi perfil actual.
  • Como usuario, no debería poder eliminar mi perfil.
  • Como usuario, debería poder ver mi perfil

Después de la revisión, solo necesitamos registrar las siguientes acciones: Show, Edit, Update. Para limitar nuestro recurso a esas acciones, usaríamos el siguiente código en nuestro conjunto de rutas.

Anidar un recurso

// NESTING A RESOURCEmap.Resource<ProfileController>(profile => { profile.Resource<CreditCardController>()});

Un recurso a veces depende de otro recurso. Al anidar un recurso, tiene una relación de uno a uno entre el recurso principal y su recurso dependiente.

Si crea un recurso creditcard y lo anida dentro de nuestro recurso profile (como se indica a la derecha), obtendrá las rutas resultantes, excluyendo las rutas de perfil:

Action HTTP Method Result (controller#action) Url Template
SHOW GET creditcard#show /profile/creditcard
NEW GET creditcard#new /profile/creditcard/new
CREATE POST creditcard#create /profile/creditcard
EDIT GET creditcard#edit /profile/creditcard/edit
ACTUALIZAR PONER tarjeta de crédito # actualizar / perfil / tarjeta de crédito
DESTRUIR ELIMINAR tarjeta de crédito # destruir / perfil / tarjeta de crédito

Recursos

map.Resources<ProductsController>();

Los recursos representan colecciones que pertenecen a tu dominio. Imagine crear una aplicación de tienda, es posible que desee exponer su catálogo para que los clientes puedan buscar y comprar productos. Los productos se considerarían recursos. La url que se genera también reflejan que hay muchos productos que se ofrecen.

Observe la pluralización de productos. Si está comenzando un sitio de comercio electrónico, lo más probable es que venda más de un producto a la vez.

Acciones

Al registrar recursos, un conjunto de acciones y métodos se registran automáticamente. Registre su controlador e implemente las acciones.

la Acción HTTP Método
ÍNDICE OBTENER
MOSTRAR OBTENER
CREAR POST
NUEVO OBTENER
EDITAR OBTENER
ACTUALIZACIÓN PONER
DESTRUIR ELIMINAR

Para nuestro ejemplo con el ProductsController, se obtendrá el siguiente resultado:

Nombrar

A veces nombras a tu controlador una cosa, pero deseas que la url de los recursos refleje otra cosa. Esto es fácil de hacer.

Se cambiará la nueva url para el índice de productos#.

Además, puede cambiar los nombres de acción predeterminados de un recurso mediante el método PathNames. Esto no es recomendable, pero nos gusta darle opciones.

Personalizar el parámetro {id}

De forma predeterminada, el nombre id se utiliza para el parámetro id de recurso en patrones de URL de ruta. Por ejemplo, el patrón de URL para los productos#mostrar acción en Acciones y Métodos HTTP anteriores es /products/{id}.

En algunos escenarios, es posible que desee usar un nombre diferente para el parámetro. Tal vez desee que el nombre del parámetro coincida con el nombre de la propiedad utilizada para identificar el recurso:

La ruta agregada para la acción users#show tendría entonces el patrón de URL /users/{username}.

Elegir acciones

A veces es posible que no necesite todos los métodos que proporcionamos. Puede eliminar acciones utilizando los siguientes métodos a la derecha.

Recursos de anidamiento

map.Resources<ProductsController>(products => { products.Resources<ReviewsController>()});

Los recursos a veces dependen de otros recursos. Al anidar recursos, tiene una relación de uno a muchos entre el recurso principal y sus recursos dependientes. Piense en un producto que tiene reviews.To para lograr esto, registraría los dos recursos de esta manera.

Rutas de miembros y colecciones

Use los métodos Member y Collection dentro de recursos para agregar rutas a la colección (sin un parámetro de ruta id) o al miembro (con un parámetro de ruta id). Los métodos disponibles para mapear son Get, Post, Put, Delete y Head. Cuando esté en el contexto de un recurso (singular), solo tendrá acceso al método Member.

Mapeo estándar

<!-- IN RAZOR VIEW --><a class="btn" href="@Url.Action("usingpath", "extras")">Path</a><a class="btn" href="@Url.Action("usingroute", "extras")">Route</a>

A veces nuestras convenciones simplemente no funcionan para usted. Podemos ser obstinados, pero no gobernamos con mano de hierro.

Se proporcionan dos métodos adicionales para que pueda agregar rutas personalizadas: Path es una mezcla de rutas tradicionales ASP.Net Sintaxis de enrutamiento MVC con nuestro envoltorio de interfaz. La ruta es una forma muy tradicional de agregar una ruta personalizada.

Áreas

Las áreas son manejadas por espacio de nombres en Enrutamiento Restful. Por lo general, hay una correlación entre las carpetas y los espacios de nombres, por lo que para la mayoría de los desarrolladores esto no es una gran diferencia de lo que ya hacen.

El controlador proporcionado al método de área se utiliza para determinar el espacio de nombres de los controladores agrupados. La cadena «mappings» se usa para determinar el nombre del área, junto con la parte url.

Recuerde que deberá proporcionar el área al generar URL. Para salir de un área, puede establecer el área en una cadena vacía. Todas las reglas con un Recurso y Recursos todavía se aplican cuando se trata de Áreas.

Motores de visualización

El enrutamiento Restful viene con dos motores de visualización: RestfulRoutingRazorViewEngine y RestfulRoutingWebFormViewEngine. Veamos uno de estos motores de visión.

Estos motores de vista cambian la forma en que ASP.Net MVC buscará vistas.

Resultado de formato

Esta es una característica que le permite usar extensiones de formato implícitas en un recurso y recursos. Hay dos métodos principales para esta característica: Responder, Conformatroutes.

<system.webServer> <modules runAllManagedModulesForAllRequests="true" /></system.webServer>
namespace RestfulRouting.Documentation.Controllers{ public abstract class ApplicationController : Controller { protected ActionResult RespondTo(Action<FormatCollection> format) { return new FormatResult(format); } }}
// IN ROUTESET// enable format routesextras.WithFormatRoutes();

Proporcionamos un conjunto de tipos conocidos listos para usar para que el uso de nuestra interfaz fluida sea un poco más agradable, pero admitimos cualquier extensión de archivo que se le ocurra. Para generar estas rutas de formato, solo especifique el formato de la siguiente manera.

Impresionante ¿verdad?! Le recomendamos que lea la siguiente sección de Peculiaridades / Trampas si planea usar rutas de formato.el suyo es útil si está creando aplicaciones de una sola página, Use con moderación y comprenda cuándo es apropiado separar la funcionalidad en sus acciones.

Redirigir enlaces muertos

Hay momentos en que tomamos mejores decisiones de url que otros. Queremos la capacidad de cambiar las URL, sin romper las URL existentes. Esto solo es necesario una vez que su aplicación se active. Esto se aplica principalmente a sitios orientados al público, pero podría ser útil en una ubicación de intranet.

Lo primero que debe tener en cuenta es que debe registrar todas sus rutas de redirección como las últimas rutas de su lista. Esto se debe a que son los menos importantes. El solo será alcanzado al acceder a un enlace antiguo. Su aplicación no debería generar estas URL, y si lo es, entonces tiene problemas.

En segundo lugar, el registro se parece a la vieja sintaxis de RestfulRouting, pero no requiere que la anides dentro de ninguna definición. Recomendaría, crear un conjunto de rutas llamado Enlaces muertos o Redirecciones y conectarlo al final de su conjunto de rutas maestro.

Por último, y esto es importante, registre la Redirectroutfilterattribte como filtro global.

Como puede ver a la derecha, simplemente establece la url antigua y proporciona valores para resolver a la nueva url. Usamos el UrlHelper debajo de las cubiertas para encontrar la ruta que mejor se adapte.

Depurador de rutas

// IN ROUTESETmap.DebugRoute("routedebug");

El enrutamiento Restful viene con un potente depurador de rutas destinado a ayudarlo a comprender sus asignaciones de rutas. Puede habilitar y deshabilitar el depurador de rutas simplemente agregando la siguiente línea a su conjunto de rutas.

Peculiaridades / Trampas

Esta sección intenta detallar algunas peculiaridades con ASP.NET Enrutamiento MVC y Restful. Estos pueden causar problemas a veces y es bueno entender por qué y cuándo pueden afectar a su aplicación.

Valores de ruta persistentes

ASP.Net MVC siempre trata de ser útil. Útil, aunque bien intencionado, a veces puede llevar a algún comportamiento extraño. El mayor problema pueden ser los valores de ruta guardados de su solicitud existente.

Comprender esta peculiaridad puede ayudarlo a depurar muchos problemas, no solo con el enrutamiento Restful, sino con ASP.NET MVC en general. Puedes ver el ejemplo a la derecha.

Niveles de asignación de mezcla

map.Resource<ProfileController>(profile => { // DOH! should be profile // not map! // EXCEPTION!!!! map.Resource<CreditCardController>()});

El enrutamiento Restful está diseñado para ser fluido y anidado. Durante la creación de su RouteSet puede llamar accidentalmente al parámetro incorrecto, lo que lleva a un error que puede ser difícil de diagnosticar. Nuestra excepción es útil, pero este es un error lo suficientemente común como para que decidiéramos documentarlo.

Espacios de nombres y conflictos de nombres

A veces queremos nombrar a los controladores de la misma manera, pero tenerlos en diferentes espacios de nombres. Esto es apropiado al construir una sección administrativa y frontal de su sitio. Solo recuerde configurar los espacios de nombres adecuadamente para que el enrutamiento pueda crear instancias del controlador correcto.