none
Uso de MapRoutes

    Debate general

  • Hola,

    En mi aplicación MVC basada en el proyecto de microsoft N-Layer y tenemos definido un BootStrapper que indica que los controllers se resuelven basandose en este metodo:

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
            {
                if (controllerType != (Type)null)
                {
                    //Try to resolve the controller using asociated IoC container.
                    return _Container.Resolve(controllerType) as IController;
                }
                else
                {
                    //if (requestContext.HttpContext.Request.Url.AbsoluteUri.ToLower().EndsWith(".js"))
    
                    // Chrome y otros navegadores siempre solicitan el favicon.ico
                    if (requestContext.HttpContext.Request.Url.AbsoluteUri.Contains("favicon.ico"))
                        return null;
                    else
                        //Fallback to default behavior.
                        return base.GetControllerInstance(requestContext, controllerType);
                }
            }
    El caso es que siempre ha funcionado correctamente, hasta que ha llegado un caso muy especial. En el AreaRegistration donde me ocurre el error tengo estos dos casos:
    context.MapRoute(
                    string.Format("{0}_ExternosDocumentacion", this.AreaName),
                    this.AreaName + "/Externos/{entityCI}/Documentacion/{action}/{ci}",
                    new { ci = UrlParameter.Optional, controller = "DocumentacionExterno" }
                );
    
    context.MapRoute(
                    string.Format("{0}_Externos", this.AreaName),
                    this.AreaName + "/Externos/{entityCI}/{controller}/{action}/{ci}",
                    new { ci = UrlParameter.Optional }
                );

    Aparentemente son identicos y entiendo que es por eso que no se resuelve de forma correcta.

    Lo resolví al poner las rutas en el orden que os muestro, así el caso especifico se me resuelve correctamente y sino trata de usar el caso general.

    Es normal que la resolución de las rutas se realicen según el orden en que se crean en el AreaRegistration o hay un modo más elegante donde el orden del mapeo en el registration no importe.


    Vota mi respuesta si te ha sido útil. Gracias.

    lunes, 13 de febrero de 2012 10:05

Todas las respuestas

  • Muy buenas,

    Te haré un pregunta, por que algo que no entiendo, a ver si así me aclaro y te puedo echar una mano.

    Cual es el objetivo de especificarle un controlador por defecto en caso de que el controlador escrito por la ruta por defecto sea "Documentacion" ? No sería más práctico o útil que tengas un controlador llamado "Documentacion"? Imagino que será por que tienes ya un controlador Documentación, pero entonces... no le usas nunca? y para que le tienes entonces? Quizás soy yo que estoy mas cegato que un topo borracho, pero no lo entiendo.

    lunes, 13 de febrero de 2012 13:30
  • >Es normal que la resolución de las rutas se realicen según el orden en que se crean en el AreaRegistration

    Te voy a responder con palabras de MS: This behavior is by design. O sea que sí, vamos. :P

    >o hay un modo más elegante donde el orden del mapeo en el registration no importe

    No. :) Bueno, es un "no" a medias. Recuerda que siempre puedes poner restricciones (constraints) a la URL de forma que si esas restricciones no se cumplen, la ruta no es considerada. Pero básicamente, el sistema usa siempre la primera ruta posible que hay definida. No usa "la que más se ajusta" si no la primera posible. Por ello es importante declararlas en el orden correcto y usar restricciones en aquellos casos en que sean aplicables.

    Te dejo un enlace sobre las restricciones en URLs para las rutas: http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    lunes, 13 de febrero de 2012 13:58
  • Quizas di cosas por sentado jejeje

    En mi caso tengo un controlador DocumentosExternos y otro DocumentosEmpresas, pero para que la url (API) sea mas elegante y no haya conflictos entre ambos los redirijo, el caso era que el de empresas funcionaba al no coincidir con otra ruta y el de externos me falló por lo que comenta Eduard en el siguiente post (el orden de definición afecta)

    Gracias de todas formas, intentaba sacar algo en claro del porque era así.


    Vota mi respuesta si te ha sido útil. Gracias.

    lunes, 13 de febrero de 2012 19:49
  • Gracias de nuevo eduard, te estas convirtiendo en mi asesor personal jeje

    Realmente cuando se me ocurrió cambiar el orden de registro de rutas y funcionó no daba crédito. Pensaba que se ajustaría más a la lógica de usar la ruta más exacta pero claro imagino que intentar adivinar eso será algo complicado.

    De todas formas gracias por confirmarmelo y por el link, le hecharé un ojo que siempre es bueno aprender cosas nuevas.


    Vota mi respuesta si te ha sido útil. Gracias.

    lunes, 13 de febrero de 2012 19:51
  • Quizas di cosas por sentado jejeje

    En mi caso tengo un controlador DocumentosExternos y otro DocumentosEmpresas, pero para que la url (API) sea mas elegante y no haya conflictos entre ambos los redirijo, el caso era que el de empresas funcionaba al no coincidir con otra ruta y el de externos me falló por lo que comenta Eduard en el siguiente post (el orden de definición afecta)

    Gracias de todas formas, intentaba sacar algo en claro del porque era así.


    Vota mi respuesta si te ha sido útil. Gracias.

    Algo era ello, algún motivo tenía que hacer, gracias por tomarte la molestia en contestarme aunque tu duda haya quedado zanajada. La verdad es que tocar el mapa de rutas es lo más... "elegante". No obstante, (por si te animas, te calientas y te pones a personalziar o modificar más el mapa de rutas) hay que tener cuidadín con un detalle un poco tonto. Cuando utilizas los helpers de mvc para crear enlaces,  el enlace resultante está formateado según el mapa de rutas. En tu caso actual, te da igual, pero te lo digo para que lo tengas en cuenta, a efectos prácticos es el mismo, es decir, va a llamar el mismo controlador, pero como en tu caso quieres controlar lo que aparece por la ruta pues... yo te aviso por si acaso que a mi me pasó.


    martes, 14 de febrero de 2012 9:33
  • ;-)

    Cuando uno empieza a toquetear la tabla de rutas se convierte en imprescindible tener a mano el "depurador" de rutas que @haacked se sacó de la manga hace ya algún tiempecillo...

    http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    martes, 14 de febrero de 2012 11:30
  • http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    Me encanta! A favoritos del tirón!

    martes, 14 de febrero de 2012 12:58