Вопрос

До сих пор (для краткости) у меня есть один маршрут в Global.Asax зарегистрирован так:

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

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

Где AdminmameSpace является еще одним пространством имен, та же идея, что и в маршруте по умолчанию, но с правильным пространством имен. Это работает нормально, я могу получить доступ к 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». Он тянет правую страницу от «/ контакта», но с URL-адресом «/ admin / home / contact».

Есть ли способ предотвратить это?

Спасибо.

Это было полезно?

Решение

Посмотрите на код для AreegistrationContext.maprooute:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top