在我的MVC5应用程序中,我有3个区域。我的项目结构如下
我已经实现了一个ActionFilter类来验证用户是否已授予特定操作方法的权限。我的ActionFilter类不在区域文件夹中。我想检查OnActionExecuting方法中的用户权限,并重定向到ErrorControl上实现的PermissionDenied操作方法。但是,它无法在区域内识别并提供错误消息,提及"在该区域内找不到控制器和操作方法"
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if(!GrantPermission(filterContext))
{
Controller contr = (BaseController)filterContext.Controller;
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "area", "" },
{ "controller", "Error" },
{ "action", "PermissionDenied" }
});
filterContext.Result.ExecuteResult(contr.ControllerContext);
}
base.OnActionExecuting(filterContext);
}
任何人都可以帮助我解决这个问题。这个已经破坏了我的一天。
答案 0 :(得分:0)
区域不是路线值。它被放入RouteData.DataTokens
字典中。但是无法从RedirectToRouteResult
设置它。
相反,您可以使用UrlHelper
生成网址,就像在ActionLink
中一样。 UrlHelper
将确定Area
的虚拟路径。然后,您只需使用RedirectResult
即可访问该网址。
if (!GrantPermission(filterContext))
{
Controller contr = (BaseController)filterContext.Controller;
var urlHelper = new UrlHelper(filterContext.RequestContext);
var redirectUrl = urlHelper.Action("PermissionDenied", "Error", new { area = "" });
filterContext.Result = new RedirectResult(redirectUrl);
filterContext.Result.ExecuteResult(contr.ControllerContext);
}
base.OnActionExecuting(filterContext);
注意:授权操作的正确方法是使用
IAuthorizationFilter
或更好,继承AuthorizeAttribute
。授权过滤器在操作过滤器之前运行。此外,它们将自动为您执行结果处理程序。