如何在OnActionExecuting中重定向到另一个区域的操作方法

时间:2015-08-25 13:46:40

标签: asp.net-mvc-5 asp.net-mvc-routing

在我的MVC5应用程序中,我有3个区域。我的项目结构如下

enter image description here

我已经实现了一个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);


    }

任何人都可以帮助我解决这个问题。这个已经破坏了我的一天。

1 个答案:

答案 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。授权过滤器在操作过滤器之前运行。此外,它们将自动为您执行结果处理程序。