Custom Filters
➤IAuthorizationFilter
➤IActionFilter
➤IResultFilter
➤IExceptionFilter
ActionFilterAttribute类
ActionFilterAttribute
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
ActionExcutingContext
属性
ActionParameters
Result
ActionExcutedContext
属性
Canceled // true 不执行
Exception //抛出异常情况
ExceptionHandled // boolean true 拿不到ActionResult
Result //可能生成假的
ResultExecutingContext
属性
Cancel
Result
ResultExecutedContext
属性
Canceled // true 不执行
Exception //抛出异常情况
ExceptionHandled // boolean true 拿不到ActionResult
Result //可能生成假的
编写ActionFilter
using System.Diagnostics;
using System.Web.Mvc;
public class TimerAttribute: ActionFilterAttribute{
public TimerAttribute(){
//By default, we should be the last filter to run
//so we run just before and after the action method.
this.Order= int.MaxValue;}
public override void OnActionExecuting(ActionExecutingContextfilterContext){
varcontroller = filterContext.Controller;
if (controller != null){
varstopwatch = new Stopwatch();
controller.ViewData[“__StopWatch”] = stopwatch;
stopwatch.Start();}}
public override void OnActionExecuted(ActionExecutedContextfilterContext){
varcontroller = filterContext.Controller;
if (controller != null){
varstopwatch = (Stopwatch)controller.ViewData[“__StopWatch”];
stopwatch.Stop();
controller.ViewData[“__Duration”] =stopwatch.Elapsed.TotalMilliseconds;}}}
==
[Timer]
public ActionResultIndex() {ViewData[“Title”] = “Home Page”;
ViewData[“Message”] = “Welcome to ASP.NET MVC!”;
varrnd= new Random();
intrandomNumber= rnd.Next(200);
Thread.Sleep(randomNumber);
return View();
}
<p>
The duration was: <%= ViewData[“__Duration”] %>
</p>
Filter执行顺序
1、Order小的先执行
2、具有同样order的,看定义范围
3、无order的最后执行
4、代码内部定义的优先执行
5、同类型的filter无法确定执行顺序
➤IAuthorizationFilter
➤IActionFilter
➤IResultFilter
➤IExceptionFilter
ActionFilterAttribute类
ActionFilterAttribute
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
ActionExcutingContext
属性
ActionParameters
Result
ActionExcutedContext
属性
Canceled // true 不执行
Exception //抛出异常情况
ExceptionHandled // boolean true 拿不到ActionResult
Result //可能生成假的
ResultExecutingContext
属性
Cancel
Result
ResultExecutedContext
属性
Canceled // true 不执行
Exception //抛出异常情况
ExceptionHandled // boolean true 拿不到ActionResult
Result //可能生成假的
编写ActionFilter
using System.Diagnostics;
using System.Web.Mvc;
public class TimerAttribute: ActionFilterAttribute{
public TimerAttribute(){
//By default, we should be the last filter to run
//so we run just before and after the action method.
this.Order= int.MaxValue;}
public override void OnActionExecuting(ActionExecutingContextfilterContext){
varcontroller = filterContext.Controller;
if (controller != null){
varstopwatch = new Stopwatch();
controller.ViewData[“__StopWatch”] = stopwatch;
stopwatch.Start();}}
public override void OnActionExecuted(ActionExecutedContextfilterContext){
varcontroller = filterContext.Controller;
if (controller != null){
varstopwatch = (Stopwatch)controller.ViewData[“__StopWatch”];
stopwatch.Stop();
controller.ViewData[“__Duration”] =stopwatch.Elapsed.TotalMilliseconds;}}}
==
[Timer]
public ActionResultIndex() {ViewData[“Title”] = “Home Page”;
ViewData[“Message”] = “Welcome to ASP.NET MVC!”;
varrnd= new Random();
intrandomNumber= rnd.Next(200);
Thread.Sleep(randomNumber);
return View();
}
<p>
The duration was: <%= ViewData[“__Duration”] %>
</p>
Filter执行顺序
1、Order小的先执行
2、具有同样order的,看定义范围
3、无order的最后执行
4、代码内部定义的优先执行
5、同类型的filter无法确定执行顺序