结果过滤器—MVC项目中结果过滤器(Result Filter)使用

  • 结果过滤器—MVC项目中结果过滤器(Result Filter)使用已关闭评论
  • 113 次浏览
  • A+
所属分类:.NET技术
摘要

结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以替换或更改 Action 结果。在 IActionResult 执行的前后执行,使用它能够控制Action的执行结果,比如:格式化结果等。需要注意的是,它只有在Action方法成功执行完成后才会运行。 一般项目中很少使用。


一、什么是结果过滤器?

结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以替换或更改 Action 结果。在 IActionResult 执行的前后执行,使用它能够控制Action的执行结果,比如:格式化结果等。需要注意的是,它只有在Action方法成功执行完成后才会运行。 一般项目中很少使用。
结果过滤器—MVC项目中结果过滤器(Result Filter)使用

执行顺序:

1、执行控制器中的构造函数,实例化控制器

2、执行具体的Action方法

3、执行ResultFilter.OnResultExecuting方法

4、渲染视图或处理结果

5、执行ResultFilter.OnResultExecuted方法

二、结果过滤器实现

结果过滤器定义:

异结果过滤器实现了 IAsyncResultFilter 或 IResultFilter 接口,当实现IAsyncResultFilter重写OnResultExecutionAsync方法,实现IResultFilter,重写OnResultExecuting和OnResultExecuted方法。

/// <summary>     /// 结果过滤器     /// </summary>     public class MyResultFilter : Attribute, IResultFilter     {          #region IResultFilter          /// <summary>         ///执行之前         /// </summary>         /// <param name="context"></param>         public void OnResultExecuting(ResultExecutingContext context)         {             if (context.Result is JsonResult)             {                 JsonResult result = (JsonResult)context.Result;                  //进行返回结果进行再次封装                 context.Result = new JsonResult(new                 {                     Success = true,                     Message = "Ok",                     Data = result.Value                 });             }         }         /// <summary>         ///执行之后         /// </summary>         /// <param name="context"></param>         public void OnResultExecuted(ResultExecutedContext context)         {             var  result = context.Result;//拿到Json结果              Console.WriteLine("在执行之后ResultFilter.OnResultExecuted方法");         }         #endregion          #region IAsyncResultFilter          /// <summary>         /// 执行时         /// </summary>         /// <param name="context"></param>         /// <param name="next"></param>         /// <returns></returns>         /// <exception cref="NotImplementedException"></exception>         public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)         {             if (context.Result is JsonResult)             {                 JsonResult result = (JsonResult)context.Result;                 context.Result = new JsonResult(new                 {                     Success = true,                     Message = "Ok",                     Data = result.Value                 });             }             await next.Invoke();         }         #endregion     } 

操作级别作用范围过滤器:

在需要使用结果过滤器上的Action标注上特性标签

 [MyResultFilter]//作用范围是操作过滤器级别 

添加测试Action:

 [Route("api/[controller]")]     [ApiController]     public class ResultFilterController : Controller     {          /// <summary>         /// 测试:调用返回JSON         /// </summary>         /// <returns></returns>         [HttpGet]         [MyResultFilter]//作用范围是操作过滤器级别         public IActionResult Test()         {             return Json(new             {                 Id = 008,                 Name = "Aliang",                 Age = 28             });          }     } 

三、验证:

接口访问调用:

访问地址:

https://localhost:5001/ResultFilter/Test 

调用接口时经过结果过滤器处理返回数据:

结果过滤器—MVC项目中结果过滤器(Result Filter)使用

建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得

结果过滤器—MVC项目中结果过滤器(Result Filter)使用