在asp.net mvc动作过滤器中重定向到指定的控制器和操作

Nic*_*sen 43 asp.net-mvc redirect action-filter

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

Ric*_*ide 90

您可以将过滤器上下文的Result设置为RedirectToRouteResult,而不是获取对HttpContent的引用并直接在ActionFilter中重定向.它有点清洁,更适合测试.

像这样:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if(something)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary {{ "Controller", "YourController" },
                                      { "Action", "YourAction" } });
    }

    base.OnActionExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*sen 17

编辑:最初的问题是如何检测会话注销,然后自动重定向到指定的控制器和操作.事实证明这个问题更有用,因为它是现在的形式.


我最终使用了一组项目来实现这一目标.

首先是此处找到的会话过期过滤器.然后我想要指定控制器/动作组合以获得重定向URL,我在这里找到了很多例子.最后我想出了这个:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想让它更可测试,我相信你可以简单地将filterContext.Result设置为RedirectResult,而不是显式重定向.最终结果是MVC仍将执行重定向,但是这样您可以编写单元测试,手动调用OnActionExecuting()然后对filterContext.Result进行断言. (7认同)

Rob*_*vey 5

使用此重载调用RedirectToAction

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    RouteValueDictionary routeValues
)
Run Code Online (Sandbox Code Playgroud)

在动作筛选器中,故事有所不同。举个好例子,请看这里:

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