tutorial route net mvc custom attribute asp asp.net-mvc-routing asp.net-mvc-5 attributerouting

asp.net mvc routing - route - Enrutamiento de atributos en MVC 5 y valores predeterminados opcionales



route attribute asp net core (2)

Los valores predeterminados de enrutamiento tradicionales significaban que podíamos acceder a estas URL y siempre terminamos en la misma acción:

/ /Home /Home/Index

Pero hoy estaríamos escribiendo algo en estas líneas:

[RoutePrefix("Home")] [Route("{action=Index}")] public class HomeController { public ActionResult Index() {} public ActionResult ... }

Pero esta definición de enrutamiento no es la misma.

/ (fails) /Home (works) /Home/Index (works)

Entonces, si cambiamos el código superior a

[RoutePrefix("Home")] [Route("{action=Index}")] public class HomeController { [Route("~/")] public ActionResult Index() {} public ActionResult ... }

Pero luego volteamos el procesamiento al revés:

/ (works) /Home (fails) /Home/Index (fails)

Podríamos hacer que el código declarativo sea más detallado y hacer que funcione como el mecanismo de enrutamiento a la antigua :

[RoutePrefix("Home")] [Route("{action=Index}")] public class HomeController { [Route("~/")] [Route("~/Home")] [Route("~/Home/Index")] public ActionResult Index() {} public ActionResult ... }

Esto funciona con las tres rutas diferentes.

Pregunta

Por supuesto, este problema está relacionado con la acción predeterminada de la aplicación que predetermina el controlador y la acción. Es solo que me pregunto si esta es la única forma de hacerlo. ¿Hay alguna forma de código menos detallado para hacer que funcione como se esperaba?


Sí, claro ... lo que tienes es la manera de hacerlo aquí ...

Modifiqué un poco el código aquí:

[RoutePrefix("Home")] [Route("{action}")] public class HomeController { [Route("~/")] // GET / [Route] // GET /Home [Route("Index")] // GET /Home/Index public ActionResult Index() {} public ActionResult ... }

Algunos detalles:
1. Su primer caso no es exactamente igual que el enrutamiento convencional ya que en este caso tiene un segmento literal Home que no es similar al enrutamiento convencional opcional de {controller}/{action}/{id} and controller = Home, action=Index,id=optional .
2. Se espera su segundo caso como por diseño, si se usa un atributo de Route en la acción, los atributos en el controlador no entran en vigencia.


ahora mismo para SEO debes usar la url canónica que significa url único algo así

public class HomeController { [Route("~/")] // GET / public ActionResult Index() {} public ActionResult ... }

por lo que el controlador del hogar es accesible solo desde la raíz