ASP.NET MVC3 Маршрутизация различных подпапок к одному контроллеру - PullRequest
2 голосов
/ 09 сентября 2011

Я пытаюсь настроить свой проект MVC, чтобы иметь URL-адреса, чтобы я мог перейти по адресу:

/ Группы /

/ Группы / Зарегистрироваться

/ Groups / Wh независимо

Но в моем контроллере я также могу пометить некоторые действия только как admin, чтобы они были доступны по адресу:

/ Admin / Groups /Удалить / {id}

Я хотел бы сохранить один GroupController и выполнить действия, чтобы:

public class GroupController : Controller
{
    public ActionResult Index(){
        return View();
    }
    [AdminAction]
    public ActionResult Delete(int id){
        ...
        return View();
    }
}

Позволял:

/ Groups - это действительный URL.

/ Admin / Groups - это действительный URL (но он может вызвать другие действия, кроме Index - возможно)

/ Admin / Groups / Delete / {id} isдействительный URL (только для публикации, что угодно)

/ Groups / Delete является недействительным URL.

Я понимаю, что это, вероятно, довольно широкий вопрос, но я новичок в MVCи я не совсем уверен, с чего начать, так что, если бы вы могли просто указать мне правильное направление, это было бы очень признательно.

1 Ответ

2 голосов
/ 09 сентября 2011

Как мы обсуждали в комментариях ниже, хотя мой первоначальный ответ ниже можно использовать для достижения запрошенного вами решения по маршрутизации, лучшим решением будет использование областей, создание области 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());
    }
}
...