2011-01-06 21 views
9

Hasta el momento (por razones de brevedad) He una ruta en global.asax registrada como esto:ASP.NET MVC Las rutas por defecto accesible a través de rutas de las áreas

routes.Add(new LowercaseRoute("{action}/{id}", new MvcRouteHandler()) 
    { 
    Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }), 
    DataTokens = rootNamespace 
    }); 

Donde "RootNamespace" es

var rootNamespace = new RouteValueDictionary(new { namespaces = new[] { "MyApp.Web.Controllers" } }); 

LowercaseRoute hereda de Route y solo hace que todas las rutas sean minúsculas. También tengo un área registrada como esto:

context.Routes.Add(new LowercaseRoute("admin/{controller}/{action}/{id}", new MvcRouteHandler()) 
    { 
    Defaults = new RouteValueDictionary(new { action = "List", id = UrlParameter.Optional }), 
    DataTokens = adminNamespace 
    }); 

Dónde adminNamespace es otro espacio de nombres, misma idea que en la ruta por defecto, pero con el espacio de nombres derecha. Esto funciona bien, puedo acceder a las direcciones URL que se ven así:

http://example.com/contact <- default route, "Home" controller 
http://example.com/admin/account <- area route, "Account" controller, default "List" action 

El problema es que este

http://example.com/admin/home/contact 

también funciona. No hay un controlador "doméstico" con una acción de "contacto" debajo del área "admin". Tira de la página derecha de "/ contacto" pero con la URL "/ admin/home/contact".

¿Hay alguna forma de evitar que esto suceda?

Gracias.

Respuesta

17

Tome un vistazo al código de AreaRegistrationContext.MapRoute:

public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces) { 
    if (namespaces == null && Namespaces != null) { 
     namespaces = Namespaces.ToArray(); 
    } 

    Route route = Routes.MapRoute(name, url, defaults, constraints, namespaces); 
    route.DataTokens["area"] = AreaName; 

    // disabling the namespace lookup fallback mechanism keeps this areas from accidentally picking up 
    // controllers belonging to other areas 
    bool useNamespaceFallback = (namespaces == null || namespaces.Length == 0); 
    route.DataTokens["UseNamespaceFallback"] = useNamespaceFallback; 

    return route; 
} 

Nota en particular, el token UseNamespaceFallback, que se establece en false por defecto. Debe tener una lógica similar si desea limitar la búsqueda al espacio de nombres del área. (Verdadero = buscar el espacio de nombres actual para el controlador y fallar esa búsqueda en todos los espacios de nombres. False = buscar solo el espacio de nombres actual.)

+1

Agregando "UseNamespaceFallback = false" al área de administración El diccionario DataTokens resolvió el problema. ¡Gracias! – pbz

Cuestiones relacionadas