2011-01-06 5 views
9

До сих пор (для краткости) Я один маршрут в global.asax зарегистрирован как это:ASP.NET MVC маршруты по умолчанию, доступные через площадь маршрутов

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

Где "rootNamespace" является

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

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 это другое пространство имена, те же идея, что и в маршруте по умолчанию, но с правом имен. Это прекрасно работает, я могу получить доступ к URL-адресов, которые выглядят следующим образом:

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 

также работает. В разделе «admin» нет «домашнего» контроллера с «контактным» действием. Он извлекает правильную страницу из «/ 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; 
} 

Примечание, в частности, маркер UseNamespaceFallback, который устанавливается в ложь по умолчанию. У вас должна быть аналогичная логика, если вы хотите ограничить поиск пространством имен области. (True = поиск в текущем пространстве имен для контроллера и отказ в поиске всех пространств имен. False = поиск только для текущего пространства имен.)

+1

Добавление «UseNamespaceFallback = false» в область администрирования Словарь DataTokens решил проблему. Благодаря! – pbz

Смежные вопросы