2012-05-23 8 views
8

Estoy intentando crear algunas rutas de mapas personalizados pero no puedo hacer que funcione correctamente.MapRoute personalizado

Mi objetivo final es poder especificar algo como lo siguiente. Donde esencialmente tengo mi URL construida con pares de valores de "id" y "nombre". El nombre es irrelevante y únicamente para las bromas de los usuarios, sin embargo, requeriré la identificación en mi controlador.

/cuadros de mando/5-Mi-Estate-Nombre /-My-subgrupo-nombre propio al 89/133-Tal vez, incluso, otro subgrupo

Para empezar estoy trabajando en la primera sección y teniendo problemas

Navegación a "http: // localhost: 53933/cuadros de mando/109-edificio-xyz", mientras que utilizando la ruta siguiente genera el error A public action method '109-building-xyz' was not found on controller 'MyInterfaceInterface.Controllers.DashboardsController'.

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

Obviamente quería esto para ser transferido a la función Índice con parámetros

¿Qué estoy haciendo mal? ¿Estoy estructurando esto correctamente? Vengo de un fondo web PHP y uso htaccess para lograr tales cosas.

Gracias

+1

¿Agregó esto después de la ruta predeterminada o antes? – Chris

+0

Creo que solo puede separar los parámetros usando una barra diagonal (pero podría confundirse con esto). Si el guión es aceptado como separador, es probable que necesite incluir el guión después de la identificación para que la ruta funcione. Además, como Chris insinúa, el orden de ruta es importante. Recomiendo usar NuGet para instalar el paquete RouteDebugger (y habilitarlo en Web.config). Le permite descubrir fácilmente qué ruta concuerda con una URL determinada. –

Respuesta

9

El orden de las rutas es importante. MVC coincidirá con la primera ruta declarada con un patrón que coincida con el patrón de URL.

Así que si usted tiene esto:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

Entonces, ¿qué va a pasar con la URL http://localhost:53933/dashboards/109-building-xyz MVC es que coincidirá con "cuadros de mando" en el controlador y "109-edificio-xyz" a la acción.

Es necesario declarar siempre sus rutas más específicos primero, y luego rutas más generales, así:

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 

Sin embargo, Morten Mertner tiene razón en su comentario - Creo que no se puede tener 2 parámetros de ruta que no están separados por una barra diagonal. Tendría que cambiar su patrón de URL a algo así para usarlo con el motor de enrutamiento predeterminado:

"dashboards/{id}/{name}" 
Cuestiones relacionadas