概念介绍

结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行。

如果我们需要创建结果过滤器需要实现IResultFilter接口。

namespace System.Web.Mvc
{
    //
    // 摘要:
    //     定义结果筛选器所需的方法。
    public interface IResultFilter
    {
        //
        // 摘要:
        //     在操作结果执行后调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        void OnResultExecuted(ResultExecutedContext filterContext);
        //
        // 摘要:
        //     在操作结果执行之前调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        void OnResultExecuting(ResultExecutingContext filterContext);
    }
}

我们看到该接口里有两个方法OnResultExecutingOnResultExecuted,前者在动作方法结果返回前调用,后者在动作方法结果返回后调用。

OnResultExecuting

我们已经知道了OnResultExecuting方法是在动作方法结果返回之前被调用的那么我们就可以利用这个方法在这里对请求的内容追加,修改,取消,在OnResultExecuting方法中传递的参数是一个ResultExecutingContext对象,它继承于ControllerContext类,它的属性如下:

名称 类型 说明
Cancel bool 获取或设置一个值,该值指示此 ResultExecutingContext 值是否为“cancel”。
Result ActionResult 获取或设置操作结果。

执行OnActionExecuting方法

下面我将演示OnActionExecuting方法,首先我们还是在之前的Filter文件夹下添加一个名为 CustomResultAttribute.cs 的过滤器类,我们继承 FilterAttribute 类和 IResultFilter 接口,为了方便演示,我们简单处理,直接在返回结果输出到视图前追加一段文字

这是我们在_CustomResultAttribute.cs_ 文件中编写的代码

    public class CustomResultAttribute : FilterAttribute, IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("<div>返回前输出</div>");
        }
        public void OnResultExecuted(ResultExecutedContext filterContext)
        {

        }
    }

接着我们调用之前的方法把动作过滤器替换成我们的结果过滤器

        [CustomResult]
        public ActionResult  GetText()
        {
            ViewBag.Message = "执行方法";
            return View();
        }

好了我们运行程序,并且在浏览器里直接请求我们这个方法,我们看看效果

OnResultExecuted方法

OnResultExecuted方法在动作方法执行后调用,传递给OnResultExecuted方法的参数是ResultExecutedContext对象。它的属性如下:

名称 类型 说明
Canceled bool 获取或设置一个值,该值指示此ResultExecutedContext 对象已被取消。
Exception Exception 获取或设置在操作方法的执行过程中发生的异常(如果有)。
ExceptionHandled bool 获取或设置一个值,该值指示是否处理异常。
Result ActionResult 获取或设置由操作方法返回的结果。

执行OnActionExecuted方法

同样的我们可以像之前动作过滤器一样可以通过获取动作方法结果返回的时间。我们修改 CustomResultAttribute.cs 过滤器代码如下:

    public class CustomResultAttribute : FilterAttribute, IResultFilter
    {
        private Stopwatch timer;
        public void OnResultExecuting(ResultExecutingContext filterContext)
        {
            timer = Stopwatch.StartNew();
        }
        public void OnResultExecuted(ResultExecutedContext filterContext)
        {
            timer.Stop();
            filterContext.HttpContext.Response.Write($"<div>方法结果结束时间为:{timer.Elapsed.TotalSeconds:F6}</div>");
        }

    }

我们在方法启动之前启动了一个计时器并在结果返回后停止了它,并且将这个时间间隔输出到我们的页面上。

结合动作过滤器和结果过滤器

MVC里自带了一个过滤器叫做ActionFilter这个过滤器就是创建动作过滤器和结合过滤器,为了演示这个过滤器的使用我们创建一个名为ActionProcessFilterAttribute的新过滤器,我们结合两种过滤器,并把每个过滤产生的步骤输出到页面上。过滤器代码如下:

public class ActionProcessFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
    {
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("<div>方法调用前</div>");
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("<div>方法调用后</div>");
        }
        public void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("<div>结果返回前</div>");
        }
        public void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("<div>结果返回后</div>");
        }
    }

我们来看看结果

笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)的更多相关文章

  1. 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)

    过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...

  2. 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)

    授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...

  3. 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)

    概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...

  4. 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)

    概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...

  5. 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)

    概念介绍 动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行. 如果我们需要创建动作过滤器需要实现IActionFilter接口. 我们看到该接口里有两 ...

  6. 笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)

    概念介绍 异常过滤器主要在我们方法中出现异常的时候触发,一般我们用 异常过滤器 记录日志,或者在产生异常时做友好的处理 如果我们需要创建异常过滤器需要实现IExceptionFilter接口. nam ...

  7. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. 201521123069 《Java程序设计》 第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 (1)泛型允许指定集合中元素的类型,在编译时就可以进行类型检查,避免运 ...

  2. 201521123012 《Java程序设计》第四周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容 答:(1)extends关键字 <1>只能有一个父类,即单继承 <1>子 ...

  3. 201521123012 《Java程序设计》第二周学习总结

    1. 本章学习总结 1.Java中String和StringBuilder的区别. 2.Arrays()的用法. 2.课后作业 1.使用Eclipse关联jdk源代码(截图),并查看String对象的 ...

  4. 201521123080《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 多线程: 操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己 ...

  5. Eclipse rap 富客户端开发总结(6) : 如何发布rap到tomcat

    1.先下载以来的打包插件 war products  输入下面的地址,选择相应的插件 新建一个 war product Configutation向导 下面的war  product Configut ...

  6. PKI信息安全知识点详细解答包含HTTPS

    1. 什么是X.509? X.509标准是ITU-T设计的PKI标准,他是为了解决X.500目录中的身份鉴别和访问控制问题设计的. 2. 数字证书 数字证书的意义在于回答公钥属于谁的问题,以帮助用户安 ...

  7. IT连创业系列:创业者逆境下的思维

    距上篇文章,又半个多月过去了,是时候来一发阶段性的总结了. 可能最近比较懒,也可能是想不到写文的主题,故写文已变成越来越艰难的一个任务. 这个系列的大标题,也改了:它从<一个想法>到< ...

  8. C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended

    c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的. 它的特性: 编码的简单易用 连接的复用 连接的管理 今天在配置C3p0的时候出现了这个warn   原因是因为要验证SSL Wed Se ...

  9. JavaScript一些常用方法一

    整理以前的笔记,在学习JavaScript时候,经常会用到一些方法,但是有时忘掉了具体用法,因此记下.方便以后查阅. 这篇博文先说明这些方法的用途: splice().push().pop() .sh ...

  10. [解读REST] 4.基于网络应用的架构风格

    上篇文章介绍了一组自洽的术语来描述和解释软件架构:如何利用架构属性评估一个架构风格:以及对于基于网络的应用架构来说,那些架构属性是值得我们重点关注评估的.本篇在以上的基础上,列举一下一些常见的(RES ...