asp .net mvc OnResultExecuting modify filterContext Result

时间:2009-05-20 18:19:50

标签: asp.net asp.net-mvc

简单的问题。如何在Controller中重写OnResultExecuting方法并强制使用其他ActionResult?

示例代码如下。目前,原始的ActionResutl继续执行,我的新RedirectResult被忽略。

RedirectResult redirectResult = new RedirectResult("http://www.google.com");
filterContext.Result = redirectResult;
base.OnResultExecuting(filterContext);

4 个答案:

答案 0 :(得分:9)

如果覆盖OnActionExecuted方法,则可以。

示例:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
  {
      filterContext.Result = new RedirectResult("http://google.com");
      base.OnActionExecuted(filterContext);
  }

答案 1 :(得分:6)

我想知道完全相同的事情。我搜索了谷歌并遇到了你的问题和其他人,所有答案似乎都是一样的。使用IActionFilter.OnActionExecuted方法。

然而,由于@ randy-burden建议您可以在结果过滤器中修改/替换RedirectToRouteResult操作结果,因此这不是一个真正的答案。那么为什么不是RedirectRoute动作结果?

如果您真的想要在IResultFilter.OnResultExecuting方法中重定向到特定网址,那么您可以执行以下任一操作:

RedirectResult redirectResult = new RedirectResult("http://www.google.com");
filterContext.Result = redirectResult;
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
filterContext.Cancel = true;
base.OnResultExecuting(filterContext);

或者

filterContext.HttpContext.Response.RedirectLocation = "http://www.google.com";
filterContext.HttpContext.Response.StatusCode = 302;
filterContext.Cancel = true;
base.OnResultExecuting(filterContext);

在第一个选项中,您手动执行RedirectResult并执行filterContext.Cancel = true,告诉框架您不需要运行filterContext.Result。在第二个选项中,你基本上是这样做的,但不是让RedirectResult配置你自己做的Http响应。

在我的情况下,我想将一个额外的查询参数附加到重定向网址并告诉框架我想要取消重定向操作结果然后重定向似乎有点错误但它确实有效。

答案 2 :(得分:1)

我需要从OnActionExecuting重定向并最终执行此操作并且它有效:

    filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                    {{"controller", "Base"}, {"action", "Error"}, {"errorMessage", errorMessage}});

答案 3 :(得分:1)

如果您使用的是MVC5,则可以执行此操作

public void OnResultExecuting(ResultExecutingContext filterContext)
{
   filterContext.HttpContext.Response.Redirect("http://www.google.com");
}