学海无涯

导航

操作筛选器 filter

 每次 ASP.NET Core 中控件器的操作方法执行的时候,操作筛选器都会被执行,我们可以在操作方法执行之前和执行之后执行一些代码,完成特定的功能。

 public class MyActionFilter1 : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
        }
    }

操作筛选器实现  IAsyncActionFilter 接口,接中中定义了 OnActionExecutionAsync 方法

其中Context参数,代表Action执行的上下文对象,从context 中我们可以获取请求的路径、参数值等信息,next参数代表下一个要执行的操作筛选器。一个项目中可以注册多个操作筛选器,这些操作筛选器组成一个链条,上一个筛选器执行完了再执行下一个。

next()就是用来指向下一个操作筛选器的委托,如果当前的操作筛选器是最后一个筛选器的话,next就会执行被真正调用的方法。

 下面是两个操作筛选器的示例:

 public class MyActionFilter1 : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            Console.WriteLine("MyActionFilter 1:开始执行");
            ActionExecutedContext r = await next();//执行下一个筛选器,如果没了,那就执行实际的方法
            if (r.Exception != null)
                Console.WriteLine("MyActionFilter 1:执行失败");
            else
                Console.WriteLine("MyActionFilter 1:执行成功");
        }
    }

  

 public class MyActionFilter2 : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            Console.WriteLine("MyActionFilter 2:开始执行");
            ActionExecutedContext r = await next();//之后没筛选器了,执行被调用的方法
            if (r.Exception != null)
                Console.WriteLine("MyActionFilter 2:执行失败");
            else
                Console.WriteLine("MyActionFilter 2:执行成功");
        }
    }

注册这两个筛选器。特别注意:注册的顺序很关键,先注册的先执行,后注册的后执行

builder.Services.Configure<MvcOptions>(options =>
{
   options.Filters.Add<MyActionFilter1>();
    options.Filters.Add<MyActionFilter2>();
});

 执行控制器方法,执行结果:

 

 调整操作筛选器注册顺序,执行结果:

 

builder.Services.Configure<MvcOptions>(options =>
{
    options.Filters.Add<MyActionFilter2>();
    options.Filters.Add<MyActionFilter1>();
});

   

 

posted on 2022-10-03 11:06  宁静致远.  阅读(60)  评论(0编辑  收藏  举报