ActionFilterAttribute横切于项目中,可在项目的各自层中使用。
几个要点:
1.
作用于方法。该类有实现时有4重载,分别是用于方法捕捉方法前后的事情(权限验证,服务器压缩等)。
2.
一个方法上可有多个不同类型ActionFilterAttribute子类对象,并设置验证顺序。
Demo:
a 实现ActionFilterAttribute子类
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
File.AppendAllText(@"f:/ActionResult.txt", string.Format("OnActionExecuted:{0}/n", this.OrderID));
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
File.AppendAllText(@"f:/ActionResult.txt", string.Format("OnResultExecuting:{0}/n", this.OrderID));
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
File.AppendAllText(@"f:/ActionResult.txt", string.Format("OnResultExecuted:{0}/n", this.OrderID));
}
}
b 在某个方法上使用。
说明:
[RecordOrderFilterAttribute(Order=1,OrderID=1)]和 [RecordOrderFilterAttributeV2(Order=2,OrderID=2)]中,
RecordOrderFilterAttribute和RecordOrderFilterAttributeV2实现相同,只是名不同;Order 父类属性,当控制器方法上有多个ActionFilterAttribute特性时,设置其执行顺序。
结果(打开f:/ActionResult.txt):
OnActionExecuting:1
OnActionExecuting:2
OnActionExecuted:2
OnActionExecuted:1
OnResultExecuting:1
OnResultExecuting:2
OnResultExecuted:2
OnResultExecuted:1
我们发现结果不是:
OnActionExecuting:1
OnActionExecuting:2
OnActionExecuted:1
OnActionExecuted:2
OnResultExecuting:1
OnResultExecuting:2
OnResultExecuted:1
OnResultExecuted:2
这里是出于上下文的思考:执行方法之间上下文不交叉,可包含。
但OnActionExecuting:1 和 OnResultExecuting:1 可以看出:在开始执行方法和准备返回View时的顺序是按我们设置的执行的。原因嘛:它们分别是执行方法 和 返回View 操作的开始。