条件ASP.NET MVC 3路由(带区域)



Hurro。

我试图根据当前用户是否是管理员来实现一些条件路由。该系统只有两种模式,管理模式或非管理模式,仅此而已。我使用区域作为我的管理区域,因为控制器名称是相同的,但它们在每种情况下都会提供不同的功能。

然而,在这个系统中,管理员不应该真正知道他们的管理员位置,他们只知道他们使用这个系统做的不是普通用户做的事情。我不希望两者在URL方面有任何区别。我想做的是能够做一些类似mysite.com/AuditHistory的事情,这取决于你是管理员还是用户,这将取决于使用了控制器。因此,如果是用户发出此请求,则会使用常规控制器文件夹中的AuditHistoryController,但如果是管理员,则会在区域/admin/controllers中使用AuditHistoryController

我已经看到了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吗?我还没有在任何地方看到过这种做法,也不确定它是否正确。

有什么想法吗?

如果用户处于角色中,您可以简单地从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());
   }
}

事实上,我认为这可能是最干净的解决方案,但可能仍然有点麻烦。

我希望这能有所帮助。

最新更新