代码之家  ›  专栏  ›  技术社区  ›  Nick Larsen

在asp.net mvc操作筛选器中重定向到指定的控制器和操作

  •  43
  • Nick Larsen  · 技术社区  · 16 年前

    我已经编写了一个动作过滤器,它检测到一个新会话,并尝试将用户重定向到一个页面,通知他们发生了这种情况。唯一的问题是我不知道如何使它重定向到动作过滤器中的控制器/动作组合。我只能知道如何重定向到指定的url。在mvc2中,有没有直接的方法重定向到动作过滤器中的控制器/动作组合?

    3 回复  |  直到 14 年前
        1
  •  94
  •   Richard Garside    15 年前

    您可以将筛选器上下文的结果设置为RedirectToRouteResult,而不是直接在ActionFilter中获取对HttpContent的引用和重定向。它更干净,更适合测试。

    这样地:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if(something)
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {{ "Controller", "YourController" },
                                          { "Action", "YourAction" } });
        }
    
        base.OnActionExecuting(filterContext);
    }
    
        2
  •  17
  •   Nick Larsen    13 年前

    编辑:最初的问题是关于如何检测会话注销,然后自动重定向到指定的控制器和操作。然而,这个问题被证明更有用,因为它是目前的形式。


    我最终使用了一个项目组合来实现这个目标。

    首先是找到了会话过期筛选器 here . 然后我想通过某种方式指定控制器/动作组合来获取重定向URL,我发现了很多这样的例子 here . 最后我想到了这个:

    public class SessionExpireFilterAttribute : ActionFilterAttribute
    {
        public String RedirectController { get; set; }
        public String RedirectAction { get; set; }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;
    
            if (ctx.Session != null)
            {
                if (ctx.Session.IsNewSession)
                {
                    string sessionCookie = ctx.Request.Headers["Cookie"];
                    if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                    {
                        UrlHelper helper = new UrlHelper(filterContext.RequestContext);
                        String url = helper.Action(this.RedirectAction, this.RedirectController);
                        ctx.Response.Redirect(url);
                    }
                }
            }
    
            base.OnActionExecuting(filterContext);
        }
    }
    
        3
  •  5
  •   Robert Harvey    16 年前

    呼叫 RedirectToAction 使用 this overload

    protected internal RedirectToRouteResult RedirectToAction(
        string actionName,
        RouteValueDictionary routeValues
    )
    

    在《行动过滤器》中,故事有点不同。有关一个很好的示例,请参见此处:

    http://www.dotnetspider.com/resources/29440-ASP-NET-MVC-Action-filters.aspx