2009-06-10 27 views
16

Creé un nuevo proyecto ASP.NET MVC e implementé un filtro de autorización de sitio.ASP.NET MVC ¿Ruta predeterminada?

Cuando mapeo las rutas al par {controller}/{action}, paso un role = "SomeRole" por defecto a la ruta.

Funciona perfectamente si voy a través de la URL completa (http://localhost/somecontroller/someaction) y que se especifica la ruta completa

MapRoute("SomeAction", "somecontroller/someaction", 
new { controller = "SomeController", action = "SomeAction", role = "SomeRole"); 

El problema es que cuando alguien visita http://thesiteaddress.com tiene que haber una ruta por defecto que invoca /home/index en lugar de / y si puedo especificar

MapRoute("Default", new { controller="somecontroller",action="action" }); 

entonces pierdo la role="SomeRole" de la anterior MapRoute.

¿Cómo puedo solucionar esto?

Respuesta

33

Asegúrese de que la ruta Default se encuentre en el BOTTOM de la tabla de rutas indicada. El orden es importante cuando se trata de tablas de enrutamiento ASP.NET MVC.

El pedido correcto es su ruta "más específica" a su ruta menos específica.

+0

¿Puede citar su fuente, por favor? –

+0

@manuelhe http://books.google.com/books?id=1NnE3fYiUuMC&pg=PA12&lpg=PA12&dq=Default+route+bottom+ASP.NET+MVC&source=bl&ots=6gOI7-HwYG&sig=1gfWRTJaHJSJTbhAy3Ib0uAjLxQ&hl=en&sa=X&ei=doz6UuaHA8PK0wGbnYHYBw&ved=0CHsQ6AEwCA # v = onepage & q = Predeterminado% 20route% 20bottom% 20ASP.NET% 20MVC & f = false –

2

Cuando no proporciona el nombre de la ruta o la acción se determina mediante una solicitud HTTP, se verá en orden desde el orden en que se agregaron. La primera vez que encuentra uno que coincide, se detiene. Entonces, lo que probablemente está sucediendo es que coincida con uno anterior al que ha agregado.

12

Phil Haack released una herramienta de depuración de ruta que puede ser muy útil para comprender problemas como este.

Con esta herramienta puede ver cómo su aplicación MVC analiza una URL y la compara con su RouteTable.

16

En realidad, George is right. MVC Routing respeta la ruta ordenada. Su última ruta debe ser lo más genérica posible, y su ruta anterior debe ser lo más específica posible.

En su caso, ambos son genéricos. Usted debe

MapRoute("SomeAction", "Post/{action}", new {controller = "Post", role = "User"); 

y luego

MapRoute("Default", new {controller="Home", action="Index", role = "Anonymous"}); 

así, darle especificidad de ambas rutas.

+9

En MVC4 La declaración de ruta "predeterminada" se movió de Global.asax a ~/App_Start/RouteConfig.cs/RegisterRoutes() –

Cuestiones relacionadas