Я создаю веб-приложение (ASP.NET MVC 5) с настраиваемым разделом администратора, где указаны все параметры приложений.
Я хочу иметь возможность легко изменить название этого раздела.
Например
myapp.com/admin/{controller}/{action}
может быть
myapp.com/custom-admin-name/{controller}/{action}
Я пытался использовать области, но кажется, что было бы сложно изменить их имя, поскольку все controllers
и models
привязаны к namespace
области.
Я также пытался установить пользовательские маршруты
routes.MapRoute(
"AdminControllerAction",
"custom-admin-name/{controller}/{action}",
new { controller = "Dashboard", action = "Index" }
);
Так что я мог бы сделать
mywebsite.com/custom-admin-name/dashboard/index
Но проблема в том, что мои контроллеры и действия администратора по-прежнему можно использовать, используя
mywebsite.com/dashboard/index
Можно ли отменить маршрутизацию по умолчанию контроллера/действия?
Есть ли более жизнеспособные решения этой проблемы, о которых я бы не подумал?
Существует способ ограничить пространства имен контроллеров для заданного маршрута, поэтому контроллеры, которые не принадлежат этим пространствам имен, будут игнорироваться.
Например, следующие ограничения будут ограничены контроллерами в пространстве имен YourApp.Controllers
(при необходимости вы можете добавить несколько пространств имен):
Route route = routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "YourApp.Controllers" }
);
route.DataTokens["UseNamespaceFallback"] = false;
Важное значение имеет отключение резервного копирования пространства имен, иначе вы просто ставите приоритет в эти пространства имен.
Таким образом, вы можете ограничить маршрут по умолчанию в пространстве имен YourApp.Controllers
как указано выше, и создать собственный маршрут администратора, ограниченный пространством имен YourApp.Controllers.Admin
:
Route route = routes.MapRoute(
"AdminControllerAction",
"custom-admin-name/{controller}/{action}",
new { controller = "Dashboard", action = "Index" },
namespaces: new[] { "YourApp.Controllers.Admin" }
);
route.DataTokens["UseNamespaceFallback"] = false;
Обратите внимание, что, как упоминалось в Tareck, маршрут администратора должен быть определен до общего маршрута.
Попробуйте удалить с помощью этого
RouteTable.Routes.Remove(RouteTable.Routes["NAME ROUTE YOU WISH TO RMOVE"]);