Условная маршрутизация ASP.NET MVC 3 (с областями) - PullRequest
2 голосов
/ 03 июня 2011

Hurro.

Я пытаюсь добиться условной маршрутизации в зависимости от того, является ли текущий пользователь администратором или нет.Система имеет только два режима: административный или неадминистративный, и ничего более.Я использую области для своей административной области, потому что имена контроллеров будут одинаковыми, но они будут обеспечивать различную функциональность почти в каждом случае.

Однако в этой системе администраторы не должнызная свое местоположение администратора, они просто знают, что они используют систему, чтобы делать что-то еще, кроме того, что делают обычные пользователи.Я не хочу, чтобы между ними было какое-либо различие с точки зрения URL.То, что я хочу сделать, это иметь возможность делать что-то вроде mysite.com/AuditHistory и зависеть от того, являетесь ли вы администратором или пользователем, будет зависеть от того, какой контроллер используется.Так что, если пользователь делает этот запрос, он будет использовать AuditHistoryController в папке обычных контроллеров, но если это администратор, он будет использовать AuditHistoryController в Areas / Admin / Controllers.

Я видел использование IRouteConstraint и могу сделать что-то вроде следующего:

public class AdminRouteConstraint : IRouteConstraint
{
    public AdminRouteConstraint() { }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return httpContext.User.IsInRole("Admin");
    }
}

С помощью следующего:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", controller = "Home", id = UrlParameter.Optional },
    new { controller = new AdminRouteConstraint() }
);

Могу ли я просто избавиться от "Admin"/ "впереди и сделать то же самое для других маршрутов, но сказать UserRouteConstraint?Хотя я нигде не видел, чтобы это было сделано, и не уверен, что это правильно.

Есть идеи, как это сделать?

1 Ответ

1 голос
/ 21 июля 2011

Не могли бы вы просто перенаправить пользователя из ActionResult, если он в роли?То есть если вы не возражаете против изменения URL-адреса?

Примерно так ...

[Authorize]
public ActionResult AuditHistory()
{
   if(Context.User.IsInRole("Admin")
   {
      return Redirect("Admin/AuditHistory");
   }
   else
   {
      return View();
   }
}

Для меня это немного хакерство.Но это может быть решением.

Очевидно, что вам нужно будет выполнить базовые проверки, такие как проверка подлинности текущего запроса и т. Д.

Если вы действительно не хотите, чтобы URL-адрес изменился, возможно, вы можете иметь два отдельных представленияи покончить с администратором Area

[Authorize]
public ActionResult AuditHistory()
{
   if(Context.User.IsInRole("Admin")
   {
      return View("AdminAuditHistory", new AdminAuditHistoryViewModel());
   }
   else
   {
      return View("AuditHistory", new AuditHistoryViewModel());
   }
}

На самом деле, я думаю, что это, вероятно, самое чистое решение, но, возможно, все еще немного хакерское.

...