可靠地检测IActionFilter.OnActionExecuted中的重定向

时间:2009-11-05 15:05:01

标签: asp.net-mvc actionfilterattribute

我有IActionFilterOnActionExecuted中执行某些操作,但是当控制器结果执行重定向时,我不想执行此操作。

我最初的想法是将ActionResult的类型检查为RedirectResultRedirectToRouteResult,但这不可靠,因为任何类型的结果都可以执行重定向(事实上我有两个自定义的。)

我是否有另一种方法可以检测到这种情况何时发生或者是不可能的,因为在动作执行之前你不会知道重定向(这样做为时已晚)?

或许只是检查ViewResultPartialViewResult会更可靠。

2 个答案:

答案 0 :(得分:3)

  

......这不像任何类型的那样可靠   结果可以执行重定向(事实上   我有两个自定义的那些)

如果他们执行重定向,则必须通过将Result设置为RedirectResult或类似方法来完成,而不仅仅是Response.Redirect。 如果它是Response.Redirect,那么它是完全错误的。
示例是AuthorizeAttribute,它将Result更改为HttpUnauthorizedResult。

所以你仍然会得到ControllerContext.Result并且可以对它进行操作。


此外,如果应用约定如何:如果ActionResult类型的名称包含“重定向”字而不是重定向

var isRedirect = filterContext.ActionResult.GetType().Name.Contains("Redirect");
  

如果看起来像鸭子,就像游泳一样游泳   鸭子和嘎嘎叫像鸭子,然后它   可能是一只鸭子。

当然,解决方案并不完美,但简单易懂。

答案 1 :(得分:0)

我建议只检查结果类型。您可以使用“[IsRedirect]”标记自定义操作,将其命名为“... Redirect”或从“IRedirectResult”派生以进行检测。

我想到的其他解决方案:

  1. 处理OnResult而执行并检查结果对HTTP上下文做了什么(URL已更改等) - 不确定这是否有效
  2. 使用伪上下文手动调用Result.Execute()并检查对该伪上下文执行的操作。如果调用任何“重定向”,您可以记住您的假上下文。
  3. 但只是检查结果类型太简单了。