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

结果,过滤器,mvc,项目,result,filter,使用 · 浏览次数 : 110

小编点评

**结果过滤器**是一个用于控制Action执行结果的AOP (抽象编程原理)技术,适用于任何需要直接环绕 View 或格式化处理的逻辑。 **实现步骤:** 1. **定义结果过滤器:**创建一个继承于 `IResultFilter` 的类,并重写 `OnResultExecuting` 和 `OnResultExecuted` 方法。 2. **在Action方法中使用结果过滤器:**使用 `[MyResultFilter]` 特性标签在Action方法上标注结果过滤器。 3. **执行ResultFilter:**在 `OnResultExecuting` 方法中,根据结果类型进行处理。 4. **执行结果过滤器:**在 `OnResultExecuted` 方法中,打印执行结果。 5. **执行结果过滤器:**在`OnResultExecuting` 方法中,如果结果是JsonResult,则将它转换成新的 JsonResult 对象并设置结果。 **示例代码:** ```csharp public class MyResultFilter : IResultFilter { // 重写OnResultExecuting 和 OnResultExecuted 方法 } public class ResultFilterController : Controller { [HttpGet] [MyResultFilter] public IActionResult Test() { return Json(new { Id = 008, Name = "Aliang", Age = 28 }); } } ``` **验证:** 访问地址 `https://localhost:5001/ResultFilter/Test`,将获取一个包含 JSON 数据的响应,并使用 `JsonResult` 类解析其内容。

正文

一、什么是结果过滤器?

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

执行顺序:

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

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

image

与结果过滤器—MVC项目中结果过滤器(Result Filter)使用相似的内容:

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

## 一、什么是结果过滤器? 结果过滤器(**ResultFilter**),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以**替换或更改 Action 结果**。在 IActionResult 执行的前后执行,使用它能够控制

5.使用日志+自定义全局异常过滤器

刚开始写文章,封装Base基类的时候,添加了trycatch异常块,不过当时没有去记录日志,直接return了。有小伙伴劝我不要吃了Exception 其实没有啦,项目刚开始,我觉得先做好整体结构比较好。像是盖楼一样。先把楼体建造出来,然后再一步一步的美化完善。 基础的仓储模式已经ok,Autofa

【转帖】纳尼,mysqldump导出的数据居然少了40万?

0、导读 用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况? 本文约1500字,阅读时间约5分钟。 1、问题 我的朋友小文前几天遇到一个怪事,他用mysqldump备份数据时,加上了 -w 选项过滤部分数据,发现导出的数据比实际上少了40万。

Python Django 模版全解与实战

**本文首先介绍了Django模板系统的基础知识,接着探讨了如何安装和配置Django模板系统,然后深入解析了Django模板的基本结构、标签和过滤器的用法,阐述了如何在模板中展示模型数据,最后使用一个实际项目的例子来演示如何在实际开发中使用Django模板系统。** ## Django模板系统的简

聊聊基于Alink库的推荐系统

概述 Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面: 算法选择 推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。 推荐方式 输入信息可以有多种选择,输入结果也有多种情况。 同时输

[转帖]20191022-从Jenkins NativeOOM到Java8内存

我把老掉牙的Jenkins升级了,它跑了几天好好的;后来我有一个python脚本使用JenkinsAPI 0.3.9每隔2.5分钟发送约300余get请求,结果过了3天,它就挂了;当我开两个脚本时,40.5小时就挂了。(可以通过搜索Jenkins日志/var/log/jenkins/* 中字符Jen

CIC滤波器仿真与实验过程及结果记录

整理于2023-10-08 0.0 前言: https://www.cnblogs.com/luxzhi/p/17734148.html 前面介绍了使用matlab中的Filter Designer工具箱进行CIC抽取滤波器设计的仿真过程与结果。下面在前面的基础上针对现有的【正点原子ZYNQ】平台,

Linux 安装软件的几种方式

哈喽大家好,我是咸鱼 相信小伙伴们都知道在 Linux 中,安装软件一般有三种方式 * yum 安装 * rpm 安装 * 源码编译安装 咸鱼平时三种安装方式都会用,但是具体原理和区别却没有去深入了解过 结果上周部门刚来的新人问我这几种安装方式的时候,一下子把我问懵了 那么今天咸鱼将会向小伙伴们介绍

WPF使用TextBlock实现查找结果高亮显示

在应用开发过程中,经常遇到这样的需求:通过关键字查找数据,把带有关键字的数据显示出来,同时在结果中高亮显示关键字。在web开发中,只需在关键字上加一层标签,然后设置标签样式就可以轻松实现。 在WPF中显示文本内容通常采用`TextBlock`控件,也可以采用类似的方式,通过内联流内容元素`Run`达

[转帖]为华为欧拉OpenEuler系统装上图形界面,结果令人惊艳(图文)

https://zhuanlan.zhihu.com/p/432118726 阅读过上期华为欧拉系统安装图文教程的小伙伴都知道,默认情况下标准安装欧拉系统后是字符界面,对于想体验桌面版本或不会使用Linux的同学抬高了一个门槛。而本身在安装系统的过程中也没有提供图形的可选项目,可猜想欧拉目前还没有没