笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)
概念介绍
动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行。
如果我们需要创建动作过滤器需要实现IActionFilter接口。
namespace System.Web.Mvc
{
//
// 摘要:
// 定义操作筛选器中使用的方法。
public interface IActionFilter
{
//
// 摘要:
// 在执行操作方法后调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnActionExecuted(ActionExecutedContext filterContext);
//
// 摘要:
// 在执行操作方法之前调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnActionExecuting(ActionExecutingContext filterContext);
}
}
我们看到该接口里有两个方法OnActionExecuting和OnActionExecuted,前者在动作方法执行前调用,后者在动作方法执行后调用。
OnActionExecuting方法
我们已经知道了OnActionExecuting方法实在动作方法调用之前被,调用的那么我们就可以利用这个方法来检测请求,并且可以在这里修改请求,取消请求,在OnActionExecuting方法中传递的参数是一个ActionExecutingContext对象,它继承于ControllerContext类,它的属性如下:
| 名称 | 类型 | 说明 |
|---|---|---|
| ActionDescriptor | ActionDescriptor | 获取或设置操作描述符。 |
| ActionParameters | IDictionary<string, object> | 获取或设置操作方法参数。 |
| Result | ActionResult | 获取或设置由操作方法返回的结果。 |
执行OnActionExecuting方法
下面我将演示OnActionExecuting方法,首先我们还是在之前的Filter文件夹下添加一个名为 CustomActionAttribute.cs 的过滤器类,我们继承 FilterAttribute 类和 IActionFilter 接口,为了方便演示,我们简单处理,判断请求类型,如果是GET请求那么我们让其抛出404错误。
这是我们在 CustomActionAttribute.cs 文件中编写的代码
public class CustomActionAttribute : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "get", StringComparison.CurrentCultureIgnoreCase))
{
filterContext.Result = new HttpNotFoundResult();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
因为创建动作过滤器需要实现IActionFilter接口中的两个方法,如果不需要实现逻辑我们可以先让其空着,因为MVC框架对动作过滤器中的两个方法都会调用。
接着我们在Home控制器里添加一个方法方法会直接在页面输出“执行方法”这几个字,接着我们在方法上应用,我们的动作过滤器
[CustomAction]
public ActionResult GetText()
{
ViewBag.Message = "执行方法";
return View();
}
好了我们允许程序,并且在浏览器里直接请求我们这个方法,我们看看效果

OnActionExecuted方法
OnActionExecuted方法在动作方法执行后调用,传递给OnActionExecuted方法的参数是ActionExecutedContext对象。这个类相比我们之前的ActionExecutingContext对象而言多了些属性,它的属性如下:
| 名称 | 类型 | 说明 |
|---|---|---|
| ActionDescriptor | ActionDescriptor | 获取或设置操作描述符。 |
| Canceled | bool | 获取或设置一个值,该值指示此ActionExecutedContext 对象已被取消。 |
| Exception | Exception | 获取或设置在操作方法的执行过程中发生的异常(如果有)。 |
| ExceptionHandled | bool | 获取或设置一个值,该值指示是否处理异常。 |
| Result | ActionResult | 获取或设置由操作方法返回的结果。 |
执行OnActionExecuted方法
我们可以通过OnActionExecuted方法来执行一些跨越动作方法的任务,比如我们可以用它来获取动作方法执行的时间。我们修改 CustomActionAttribute.cs 过滤器代码如下:
public class CustomActionAttribute : FilterAttribute, IActionFilter
{
private Stopwatch timer;
public void OnActionExecuting(ActionExecutingContext filterContext)
{
timer = Stopwatch.StartNew();
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
timer.Stop();
if (filterContext.Exception == null)
{
filterContext.HttpContext.Response.Write($"<div>方法执行时间:{timer.Elapsed.TotalSeconds:F6}s</div>");
}
}
}
我们在方法启动之前启动了一个计时器并在方法执行后停止了它,并且将这个时间间隔输出到我们的页面上。

笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)的更多相关文章
- 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)
授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)
概念介绍 结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行. 如果我们需要创建结果过滤器需要实现IResultFilter接口. namespa ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)
概念介绍 异常过滤器主要在我们方法中出现异常的时候触发,一般我们用 异常过滤器 记录日志,或者在产生异常时做友好的处理 如果我们需要创建异常过滤器需要实现IExceptionFilter接口. nam ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- 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浏览器(操作 ...
随机推荐
- MiniProfiler工具
MiniProfiler工具介绍 MiniProfiler是一款针对.NET, Ruby, Go and Node.js的性能分析的轻量级程序.可以对一个页面本身,及该页面通过直接引用.Ajax. ...
- a链接易混淆与form表单简易验证用法详解
链接可以说遍布互联网,比如你想提供一个可以跳转到百度首页的链接给网友,那么代码如下: <a href="http://www.baidu.com">百度一下,你就知道& ...
- java 多线程(0) Java线程
线程 线程是系统调度的基本单元,每当创建一个进程时,会有许多的线程,也叫轻量级进程,在一个进程中拥有多个线程,各自都有自己的计数器,堆和局部变量属性,并且能够分享内存变量. 为什么要使用多线程 1. ...
- sudoku作业
1.Github项目地址: https://github.com/ataiyang/ls 2.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟 ...
- 201521123111《Java程序设计》第8周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 附上ppt: 1.2 选做:收集你认为有用的代码片段 List strList = new ArrayList ...
- 201521123027 <java程序设计>第七周学习总结
1.本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: 源代码: //contains()方法 public boolean c ...
- 201521145048《Java程序设计》第4周学习总结
1. 本章学习总结 学会了如何去设计一个类,尽量用private修饰属性,public修饰方法. 了解继承的目的. 了解继承和多态的关系. 了解关键字extends super final overr ...
- Java内部类的总结
内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. 内部类分为: 成员内部类.局部内部类.静态嵌套类.匿名内部类 . 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类 ...
- 云计算之路-阿里云上:访问阿里云CDN上的图片,自动跳转到百度首页
昨天有用户向我们反馈一篇博文(一条语句导致CPU持续100%)中的部分图片不能显示,我们的图片访问用的是阿里云CDN,原以为是某个CDN节点不稳定的问题,但在排查时发现这些图片不能显示竟然是因为请求时 ...
- HTTP协议报文、工作原理
一.web及网络基础 1.HTTP的历史 1.1.HTTP的概念: HTTP(Hyper Text Transfer Protocol ...