2011-02-12 17 views
5

Estoy tratando de escribir un prototipo realmente simple de un sistema CMS usando ASP.Net MVC 3.¿Cómo consigo que este enrutamiento ASP.NET funcione correctamente?

El sistema tiene un solo controlador con dos acciones: mostrar y crear.

El formato para la acción 'Mostrar' está destinado a tomar hasta 5 partes opcionales, p. domain.com/part1/part2/part3/part4/part5

El formato para la acción 'Mostrar' es similar, pero debe tener una parte principal 'crear', p. domain.com/create/part1/part2/part3/part4/part5

tengo la siguiente configuración en mi global.asax:

routes.MapRoute(
     "CreatePageRoute", 
     "create/{part1}/{part2}/{part3}/{part4}/{part5}", 
     new 
      { 
       controller = "Page", 
       action = "Create", 
       part1 = UrlParameter.Optional, 
       part2 = UrlParameter.Optional, 
       part3 = UrlParameter.Optional, 
       part4 = UrlParameter.Optional, 
       part5 = UrlParameter.Optional 
      }); 

    routes.MapRoute(
     "Default", 
     "{part1}/{part2}/{part3}/{part4}/{part5}", 
     new 
      { 
       controller = "Page", 
       action = "Show", 
       part1 = UrlParameter.Optional, 
       part2 = UrlParameter.Optional, 
       part3 = UrlParameter.Optional, 
       part4 = UrlParameter.Optional, 
       part5 = UrlParameter.Optional 
      } 
     ); 

Si mi método de 'Mostrar' no encuentra una página que coincida con el ruta suministrada, devuelve una página 'no encontrada' que incluye una opción para crear una nueva página con la ruta suministrada. Este enlace se define utilizando la siguiente:

@Html.ActionLink("Yes", "Create") 

[el "Sí" representa la respuesta a la pregunta "¿qué quieres crear una página para esta ruta"]

Así que cuando se prueba el 'defecto 'ruta, veo que mi 'acción show' se llama con éxito para todas las vías de acceso siguientes: {vacías} un a/b a/b/c a/b/c/d a/b/c/d/e

que es genial.

Sin embargo, el enlace 'crear' resultante generado por la instrucción "@ Html.ActionLink (" Sí "," Crear ") da resultados inconsistentes. Parece generar un hipervínculo diferente según la duración de la entrada. Los resultados son los siguientes:

Por ruta "{vacío}", el enlace ofrece "localhost {: puerto} /" - que estaba esperando "localhost {: puerto}/crear"

Por ruta "/a ", el enlace ofrece" localhost {: port}/"- Esperaba" localhost {: port}/create/a "

Para la ruta"https://stackoverflow.com/a/b ", el enlace ofrece" localhost { : puerto}/a "Esperaba" localhost {: port}/create/a/b "

Para la ruta"https://stackoverflow.com/a/b/c ", el enlace ofrece" localhost {: port}/a/b "- Esperaba" localhost {: port}/create/a/b/c "

Para la ruta "/ a/b/c/d", el enlace ofrece "localhost {: port}/create/a/b/c/d" - que es lo que esperaba

Para ruta "https://stackoverflow.com/a/b/c/d/e", el enlace ofrece "localhost {: puerto}/crear/a/b/c/d/e" - que es lo que estaba esperando

¿por qué sólo trabajo cuando proporciono "/ a/b/c/d" o "/ a/b/c/d/e"?

sé que estoy siendo idiota, por favor me

arena

+0

Hace un tiempo tuve un problema similar. Intenta cambiar 'UrlParameter.Optional' por' '' ' – Omar

Respuesta

1

ayudar creo que múltiples parámetros opcionales están causando la discrepancia.
¿Qué tal:

routes.MapRoute("Create5", "create/{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Create", part5 = UrlParameter.Optional }); 
    routes.MapRoute("Create3", "create/{part1}/{part2}/{part3}", new { controller = "Page", action = "Create", part3 = UrlParameter.Optional }); 
    routes.MapRoute("Create1", "create/{part1}", new { controller = "Page", action = "Create", part1 = UrlParameter.Optional }); 

    routes.MapRoute("Default5", "{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Show", part5 = UrlParameter.Optional }); 
    routes.MapRoute("Default3", "{part1}/{part2}/{part3}", new { controller = "Page", action = "Show", part3 = UrlParameter.Optional }); 
    routes.MapRoute("Default1", "{part1}", new { controller = "Page", action = "Show", part1 = UrlParameter.Optional }); 
+0

Muchas gracias, esto funciona bien. Además, la forma en que su solución redujo el número de rutas requeridas por el uso juicioso de los parámetros opcionales fue esclarecedora. Gracias por ayudarme. – sandy

Cuestiones relacionadas