我有IActionFilter
在OnActionExecuted
中执行某些操作,但是当控制器结果执行重定向时,我不想执行此操作。
我最初的想法是将ActionResult
的类型检查为RedirectResult
或RedirectToRouteResult
,但这不可靠,因为任何类型的结果都可以执行重定向(事实上我有两个自定义的。)
我是否有另一种方法可以检测到这种情况何时发生或者是不可能的,因为在动作执行之前你不会知道重定向(这样做为时已晚)?
或许只是检查ViewResult
和PartialViewResult
会更可靠。
答案 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”派生以进行检测。
我想到的其他解决方案:
但只是检查结果类型太简单了。