翼度科技»论坛 编程开发 .net 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
一、什么是结果过滤器?

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

执行顺序:

1、执行控制器中的构造函数,实例化控制器
2、执行具体的Action方法
3、执行ResultFilter.OnResultExecuting方法
4、渲染视图或处理结果
5、执行ResultFilter.OnResultExecuted方法
二、结果过滤器实现

结果过滤器定义:

异结果过滤器实现了 IAsyncResultFilter 或 IResultFilter 接口,当实现IAsyncResultFilter重写OnResultExecutionAsync方法,实现IResultFilter,重写OnResultExecuting和OnResultExecuted方法。
  1. /// <summary>
  2.     /// 结果过滤器
  3.     /// </summary>
  4.     public class MyResultFilter : Attribute, IResultFilter
  5.     {
  6.         #region IResultFilter
  7.         /// <summary>
  8.         ///执行之前
  9.         /// </summary>
  10.         /// <param name="context"></param>
  11.         public void OnResultExecuting(ResultExecutingContext context)
  12.         {
  13.             if (context.Result is JsonResult)
  14.             {
  15.                 JsonResult result = (JsonResult)context.Result;
  16.                 //进行返回结果进行再次封装
  17.                 context.Result = new JsonResult(new
  18.                 {
  19.                     Success = true,
  20.                     Message = "Ok",
  21.                     Data = result.Value
  22.                 });
  23.             }
  24.         }
  25.         /// <summary>
  26.         ///执行之后
  27.         /// </summary>
  28.         /// <param name="context"></param>
  29.         public void OnResultExecuted(ResultExecutedContext context)
  30.         {
  31.             var  result = context.Result;//拿到Json结果
  32.             Console.WriteLine("在执行之后ResultFilter.OnResultExecuted方法");
  33.         }
  34.         #endregion
  35.         #region IAsyncResultFilter
  36.         /// <summary>
  37.         /// 执行时
  38.         /// </summary>
  39.         /// <param name="context"></param>
  40.         /// <param name="next"></param>
  41.         /// <returns></returns>
  42.         /// <exception cref="NotImplementedException"></exception>
  43.         public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
  44.         {
  45.             if (context.Result is JsonResult)
  46.             {
  47.                 JsonResult result = (JsonResult)context.Result;
  48.                 context.Result = new JsonResult(new
  49.                 {
  50.                     Success = true,
  51.                     Message = "Ok",
  52.                     Data = result.Value
  53.                 });
  54.             }
  55.             await next.Invoke();
  56.         }
  57.         #endregion
  58.     }
复制代码
操作级别作用范围过滤器:

在需要使用结果过滤器上的Action标注上特性标签
  1. [MyResultFilter]//作用范围是操作过滤器级别
复制代码
添加测试Action:
  1. [Route("api/[controller]")]
  2.     [ApiController]
  3.     public class ResultFilterController : Controller
  4.     {
  5.         /// <summary>
  6.         /// 测试:调用返回JSON
  7.         /// </summary>
  8.         /// <returns></returns>
  9.         [HttpGet]
  10.         [MyResultFilter]//作用范围是操作过滤器级别
  11.         public IActionResult Test()
  12.         {
  13.             return Json(new
  14.             {
  15.                 Id = 008,
  16.                 Name = "Aliang",
  17.                 Age = 28
  18.             });
  19.         }
  20.     }
复制代码
三、验证:

接口访问调用:

访问地址:
  1. https://localhost:5001/ResultFilter/Test
复制代码
调用接口时经过结果过滤器处理返回数据:

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


来源:https://www.cnblogs.com/wml-it/archive/2023/08/16/17633689.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具