Как мы обсуждали в комментариях ниже, хотя мой первоначальный ответ ниже можно использовать для достижения запрошенного вами решения по маршрутизации, лучшим решением будет использование областей, создание области Admin
и создание контроллеров в вашем администраторе.область для выполнения административных задач для различных объектов, таких как группа, пользователь и т. д. Это позволяет более легко настраивать ограниченные административные функции, а также является лучшим проектом и лучшей моделью безопасности.
ОРИГИНАЛЬНЫЙ ОТВЕТ
То, что вы хотите, может быть достигнуто с помощью следующих маршрутов:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Admin", // Route name
"admin/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
Однако, как сказал Акос в комментариях, гораздо лучше отделитьадминистративные функции в другой контроллер.Хотя это возможно, я бы рекомендовал не использовать этот дизайн.
ОБНОВЛЕНИЕ
Можно использовать RouteConstraint
на вашем маршруте по умолчанию, чтобы сделать его неудачным, еслиДействия администратора запрашиваются.Маршрут по умолчанию будет выглядеть так:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional, // Parameter defaults
new { action = IsNotAdminAction() } // route constraint
);
RouteConstraint будет выглядеть так:
public class IsNotAdminAction : IRouteConstraint
{
private string adminActions = "create~delete~edit";
public IsNotAdminAction()
{ }
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
// return false if there is a match
return !adminActions.Contains(values[parameterName].ToString().ToLowerInvariant());
}
}