2011-01-06 2 views
9

지금까지 (간결) 나는 Global.asax에 하나 개의 경로는 다음과 같이 등록 : "rootNamespace는"ASP.NET MVC의 기본 노선

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

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

입니다

경우 LowercaseRoute는 Route를 상속하며 모든 경로를 소문자로 만듭니다. 또한 다음과 같이 등록 된 지역이 있습니다

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

adminNamespace가 다른 네임 스페이스, 기본 경로에서와 같은 생각하지만, 올바른 네임 스페이스.

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

문제는이

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

도 작동한다는 것입니다 : 이것은 잘 작동, I는 다음과 같이 URL에 액세스 할 수 있습니다. "admin"영역에는 "contact"액션이있는 "home"컨트롤러가 없습니다. "/ contact"에서 올바른 페이지를 가져 오지만 URL은 "/ admin/home/contact"입니다.

이 문제를 방지 할 수있는 방법이 있습니까?

감사합니다.

답변

17

는 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; 
} 

참고 특히 기본적으로 false로 설정되어 UseNamespaceFallback 토큰을. 검색을 영역의 네임 스페이스로 제한하려면 비슷한 논리가 필요합니다. (True = 컨트롤러의 현재 네임 스페이스를 검색하고 모든 네임 스페이스를 검색하지 못하면 False = 현재 네임 스페이스 만 검색하십시오.)

+1

"UseNamespaceFallback = false"를 관리 영역에 추가 DataTokens 사전은 문제를 해결했습니다. 감사! – pbz