Маршруты по умолчанию asp.net mvc доступны по маршрутам
-
26-09-2019 - |
Вопрос
До сих пор (для краткости) у меня есть один маршрут в 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 = Поиск только текущего пространства имен.)