【问题标题】:How to redirect to an action method of another area within OnActionExecuting如何在 OnActionExecuting 中重定向到另一个区域的操作方法
【发布时间】:2015-11-19 06:16:49
【问题描述】:

在我的 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);


    }

谁能帮我解决这个问题。这已经毁了我的一天。

【问题讨论】:

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


    【解决方案1】:

    区域不是路线值。它被放入RouteData.DataTokens 字典中。但是没有办法从RedirectToRouteResult设置。

    相反,您可以使用UrlHelper 来生成URL,就像在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。授权过滤器在操作过滤器之前运行。此外,它们会自动为您执行结果处理程序。

    【讨论】:

    • 感谢您的快速回复以及对我很有帮助的建议。我尝试了这段代码,但它总是为 redirectUrl 设置 null var redirectUrl = urlHelper.Action("PermissionDenied", "Error", new { area = "" });
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2014-08-28
    相关资源
    最近更新 更多