学海无涯

导航

统计

操作筛选器 filter

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

1
2
3
4
5
6
public class MyActionFilter1 : IAsyncActionFilter
   {
       public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
       {
       }
   }

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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:执行成功");
       }
   }

  

1
2
3
4
5
6
7
8
9
10
11
12
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:执行成功");
       }
   }

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

1
2
3
4
5
builder.Services.Configure<MvcOptions>(options =>
{
   options.Filters.Add<MyActionFilter1>();
    options.Filters.Add<MyActionFilter2>();
});

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

 

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

 

1
2
3
4
5
builder.Services.Configure<MvcOptions>(options =>
{
    options.Filters.Add<MyActionFilter2>();
    options.Filters.Add<MyActionFilter1>();
});

   

 

posted on   宁静致远.  阅读(62)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示