none
Agregar Map.Route para usar en todos los controllers RRS feed

  • Pregunta

  • Buenas tardes,

    Estoy desarrollando una aplicación en MVC con C#.

    MVC presenta una ruta por defecto:

     routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );

    Esta me funciona perfectamente para el Home/Index ya que se acopla a la URL que me retorna ASP.NET al utilizar FormsAuthenticationTicket:

    http://localhost:56003/Usuario/Ingreso?ReturnUrl=%2f

    Eso deseo que se mantenga tal cual esta.

    Ahora lo que quiero hacer es que para todos los demas controllers que contengan un action con parametro, la url tenga el formato:

    {controller}/{id}/{action}

    El único detalle que veo es que a cada MapRoute se le indica que controller y que action los va a utilizar, aun así es posible crear un MapRoute para todos los controller salvo el de Home/Index?

    Saludos,


    Carlos Márquez
    San Pedro Sula
    Honduras


    lunes, 23 de mayo de 2016 20:50

Respuestas

  • Si la primera de las rutas sola la quieres para un controlador concreto, por ejemplo "LoginController", no le pongas {Controller}, ponle "fijo" el nombre del controlador deseado:

                routes.MapRoute(
                    name: "Default",
                    url: "Login/{action}/{id}",
                    defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
                );

    De esta manera, cuando la ruta recibida empiece por "Login" se aplicará esa entrada del mapa de rutas, y todo lo demás se saltará esa ruta y usará la segunda que has declarado debajo.

    viernes, 27 de mayo de 2016 6:12

Todas las respuestas

  • Sí, se puede, y además es muy fácil. El truco está en que las rutas se procesan por el orden en que las escribes, y en cuanto se cumple una ya no sigue mirando las demás. Así que pon primero una ruta que sea "Home/Index" (o "Home/{Action}/id" si la necesitas) y luego debajo de ella pones la ruta predeterminada. Con eso consigues que siempre se use la primera cuando te llamen al Home, y cualquier cosa que no cuadre con esa primera ruta se procese de la manera predeterminada.
    martes, 24 de mayo de 2016 5:34
  • hola

    pero esto no lo habias planteado hacerlo con el atributo [Route] ?

     Understanding Attribute Routing in ASP.NET MVC

    Attribute Routing in ASP.NET MVC 5

    fijate en el ejemplo como define

        [Route("clients/{clientId}/orders")] 
        public IEnumerable GetOrdersByClient(int clientId) 
        { 
        //TO DO 
        }

    creo que es algo como eso lo que buscas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 24 de mayo de 2016 12:13
  • Hola, Alberto/Tuttini.

    Con el [Route("clients/{clientId}/orders")]  lo he conseguido, pasa que no quiero estar colocando ese atributo por cada action que realice.

    En mi RouteConfig he hecho lo siguiente:

    public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapMvcAttributeRoutes();
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
    
                routes.MapRoute(
                    name: "Default1",
                    url: "{controller}/{Id}/{action}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }

    Para que en el home y el index lo tome como por defecto por lo del AuthenticationTicket, luego todos los demas quiero que usen el Default1, intento pero cuando quiero utilizar algun action con parámetro me muestra en la URL la que se define en Default no en Default1

    Saludos,


    Carlos Márquez
    San Pedro Sula
    Honduras


    jueves, 26 de mayo de 2016 20:20
  • Si la primera de las rutas sola la quieres para un controlador concreto, por ejemplo "LoginController", no le pongas {Controller}, ponle "fijo" el nombre del controlador deseado:

                routes.MapRoute(
                    name: "Default",
                    url: "Login/{action}/{id}",
                    defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
                );

    De esta manera, cuando la ruta recibida empiece por "Login" se aplicará esa entrada del mapa de rutas, y todo lo demás se saltará esa ruta y usará la segunda que has declarado debajo.

    viernes, 27 de mayo de 2016 6:12
  • Hola, Alberto.

    Coloqué {controller} debido a que las vistas que necesiten enviar un parámetro puedan utilizar esta nueva ruta.

    y el authenticationTicket utilice la de default.

    Hace falta configurar algo mas?

    saludos,


    Carlos Márquez
    San Pedro Sula
    Honduras

    viernes, 27 de mayo de 2016 16:28
  • Hace falta configurar algo mas?

    El problema es que tal como lo has puesto hay ambigüedad. Tienes dos rutas así:

    {controller}/{action}/{id}
    {controller}/{Id}/{action}

    Entonces, si te navegan a /alfa/bravo/charlie, ¿qué es? ¿controlador alfa, acción bravo e id=charlie? ¿o controlador alfa, accion charlie e id=bravo? La respuesta es que te toma la primera opción, y la segunda no la usa nunca para nada. Por eso te decía yo que distinguieses una de las dos rutas poniéndole un valor fijo, y pongas esa la primera para que responda ante el mencionado valor (y todos los demás usarán la segunda).

    viernes, 27 de mayo de 2016 19:31
  • Hola, Alberto.

    Lo he resulto de esta forma:

    public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapMvcAttributeRoutes();
    
                routes.MapRoute(
                     name: "Default1",
                     url: "{controller}/{id}/{action}"
                );
    
                routes.MapRoute(
                     name: "Default",
                     url: "{controller}/{action}/{id}",
                     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
    
    
            }


    Carlos Márquez
    San Pedro Sula
    Honduras

    viernes, 27 de mayo de 2016 20:23