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());
}
}
事实上,我认为这可能是最干净的解决方案,但可能仍然有点麻烦。
我希望这能有所帮助。