笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)
概念介绍
结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行。
如果我们需要创建结果过滤器需要实现IResultFilter接口。
namespace System.Web.Mvc
{
//
// 摘要:
// 定义结果筛选器所需的方法。
public interface IResultFilter
{
//
// 摘要:
// 在操作结果执行后调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnResultExecuted(ResultExecutedContext filterContext);
//
// 摘要:
// 在操作结果执行之前调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnResultExecuting(ResultExecutingContext filterContext);
}
}
我们看到该接口里有两个方法OnResultExecuting和OnResultExecuted,前者在动作方法结果返回前调用,后者在动作方法结果返回后调用。
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结果过滤器)的更多相关文章
- 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)
授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)
概念介绍 动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行. 如果我们需要创建动作过滤器需要实现IActionFilter接口. 我们看到该接口里有两 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)
概念介绍 异常过滤器主要在我们方法中出现异常的时候触发,一般我们用 异常过滤器 记录日志,或者在产生异常时做友好的处理 如果我们需要创建异常过滤器需要实现IExceptionFilter接口. nam ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
随机推荐
- 201521123059 《Java程序设计》第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123064 《Java程序设计》第6周学习总结
1. 本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123100 《Java程序设计》 第2周学习总结
一. 本章学习总结 1.本周学习了Java语言中各种数据类型以及运算符,其中大部分还是和c语言差不多,发现了各种语言的相通性 2.进一步学习了eclipse的功能和使用方法,学会了如何将其与码云连接更 ...
- 201521123039《Java程序设计》第十三周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 下面是IP地 ...
- PHP面向对象三大特性之一:封装
面向对象的三大特性:封装.继承.多态 1.封装 封装的目的:让类更加安全,做法是不让外界直接访问类的成员 具体做法:1.成员变为私有:访问修饰符(public.private.protected) ...
- find命令基础讲解
目录 前言 find命令 查找条件 指定搜索层级 根据文件名和inode查找 根据属名属主查找 根据文件类型查找 组合条件 根据文件大小查找 根据时间戳查找 根据权限查找 动作处理 参数替换xargs ...
- java通过JDBC链接SQLServer2012【转载!!!超详细】
http://blog.csdn.net/stewen_001/article/details/19553173/
- springmvc05-Spring+Springmvc+Hibernate实现简单的用户管理系统
1, 导入\spring-framework-3.2.4.RELEASE\libs\disk下所有包; hibernate-distribution-3.6.7.Final\lib\required下 ...
- JavaSE(九)之反射
开始接触的时候可能大家都会很模糊到底什么是反射,大家都以为这个东西不重要,其实很重要的,几乎所有的框架都要用到反射,增加灵活度.到了后面几乎动不动就要用到反射. 首先我们先来认识一下对象 学生---- ...
- readfile & file_get_contents异同
记录一下:应用memcache时,准备把整个文件缓存到内存中,遇到了比较奇怪的事情,因为最初使用readfile来读取文件,结果这个函数返回一个字节数,而不是一个字符串,于是文件没办法再输出,最后使用 ...