首页 > 其他分享 >结果过滤器—MVC项目中结果过滤器(Result Filter)使用

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

时间:2023-08-16 12:22:24浏览次数:36  
标签:JsonResult 结果 Filter Action MVC Result context 过滤器

一、什么是结果过滤器?

结果过滤器(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

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

image

标签:JsonResult,结果,Filter,Action,MVC,Result,context,过滤器
From: https://www.cnblogs.com/wml-it/p/17633689.html

相关文章

  • Spring 与 Spring MVC 相关知识点回顾整合
    1.Spring框架1.1.Spring框架的作用Spring框架主要解决了创建对象和管理对象的相关问题。通过Spring创建并管理对象,可以使得开发者不再反复关心对象的创建过程,并且,默认情况下,由Spring创建的对象都是单例的,这是非常有必要的!由Spring创建的对象通常称之为SpringBean。由于Sp......
  • spring mvc 前端返回 js
    @RequestMapping(value="/test",produces="text/html;charset=UTF-8")@ResponseBodypublicStringtest(){Stringurl="";return"<script>window.location.href='"+url+"';</script>"; ......
  • Spring,Spring MVC,Spring Boot 之间什么关系
    Spring、SpringMVC和SpringBoot都是Java生态系统中的框架,用于简化企业级应用程序的开发。它们之间的关系可以概括如下:Spring:Spring是一个综合性的框架,提供了许多功能,包括依赖注入(DependencyInjection)、面向切面编程(Aspect-OrientedProgramming)、事务管理等。Spring......
  • 使用布隆过滤器求两个大文件交集
    随着互联网的发展,大数据应用越来越多。如何在内存有限的条件下,对超大规模数据进行效率处理,是一个值得探讨的问题。本文将以求两个文件共同元素为例,探讨一种基于布隆过滤器的高效算法。问题描述假设有文件A和文件B,各包含50亿个url,每个url64字节,内存限制为4G。要求找出A和B......
  • asp.net mvc 生命周期
    ASP.NETMVC生命周期由以下几个阶段组成:初始化(Initialization):在这个阶段,创建了MVC应用程序的实例。所有的对象、路由和模块都会在这个阶段被初始化。Routing:路由是一个可以将URL映射到具体的controller和action的机制。在这个阶段,系统会选择一个合适的控制器来处理请求......
  • ASP.Net MVC文件访问控制
    程序需求:通用的可以控制某个文件夹下所有所有文件的访问,且可后期扩展文件根目录下增加“FileAccessControl.cs”的一般处理程序,代码如下:(文件名可以自定义)///<summary>///用于文件是否可以访问的判断///</summary>publicclassFileAccessControl:IHttpHandler{pu......
  • 周日 Filter
    importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;//@WebFilter("/hello.jsp")@WebFilter("/*")publicclassFilterDemo2implementsFilter{@OverridepublicvoiddoFilter(ServletR......
  • pyspark的filter()、distinct()、sortBy() 函数
    ##py_pyspark_test.py#py_learn##CreatedbyZ.Steveon2023/8/1217:38.#frompysparkimportSparkConf,SparkContextconf=SparkConf().setMaster("local[*]").setAppName("rdd_test")sc=SparkContext(conf=conf)#rdd=......
  • Extended Kalman Filter vs. Error State Kalman Filter for Aircraft Attitude Estim
    EKF与ESKF的对比“Engineerscansolveexactproblemsusingnumericalapproximations,ortheycansolveapproximateproblemsexactly"-FredDaum.对出现在实际问题中的非线性的运动学(dynamic)模型以及/或非线性的观测方程进行线性化的操作,然后基于这个线性化的方程计算......
  • SpringMVC总结
    SpringMVC:Web层框架 @RestControll @Controller实例化对象,并添加到容器 @ResponseBody将返回结果转换为JSON格式 @RequestMapping(value="url可以定义多个",method=POST|GET)映射请求地址 value映射地址可以定义多个 method如果不写,则默认匹配所有请求方式。 @RequestPara......