看起来我又要做一些奇怪的事......
情况:
public ExperimentAttribute
{
public override void OnActionExecuted (ActionExecutingContext filterContext)
{
filterContext.Result =
new RedirectToRouteResult (
new RouteValueDictionary (new { Action = "Action2", Controller = "Experiment" }));
}
}
public ExperimentController
{
[Experiment]
public ActionResult ExperimentEntryPoint ()
{
RedirectToAction ("Action1", "Experiment");
}
public ActionResult Action1 ()
{
/* ... */
}
public ActionResult Action2 ()
{
/* ... */
}
}
那么,哪个重定向会发生?控制器动作中的一个,ActionFilter中的那个还是两个?
答案 0 :(得分:1)
所以我刚刚进行了一项实验,证实了我的预期。
ExperimentEntryPoint返回一个ActionResult,即重定向到Action1。
OnActionExecuted会在框架的其余部分处理之前覆盖结果。说到它,它会看到重定向到Action2命令。
很好,很清楚。
答案 1 :(得分:1)
我想不出一个原因(是的! - 我可以想到你可能想在OnActionExecuting()中执行它的几个原因,在你的Action方法代码执行之前)使用filterContext.Result来改变ActionResult OnActionExecuting()方法,但绝对允许。
执行顺序是:
正如您的实验所示,您可以在OnActionExecuted()和OnActionExecuting()中更改filterContext.Result。因为OnActionExecuted()在您的Controller代码之后被调用(例如:return RedirectToAction()),所以它设置为ActionResult优先。
我在Steven Sanderson的书“Pro ASP.NET MVC框架”中找到了对ActionFilters的不错报道。 [1] [2]
[1] http://books.google.com/books?id=Xb3a1xTSfZgC(Google图书预览中没有关于ActionFilters的内容)
[2] http://blog.codeville.net/2009/04/29/now-published-pro-aspnet-mvc-framework-apress/
答案 2 :(得分:0)
它们不能同时发生,因为它们都返回HTTP 302重定向。
该属性将执行重定向,因为它是在将结果发送到客户端之前发生的最后一件事。 OnActionExecuting和OnActionExecuted都将发生在控制器的操作结果之上。