MVC源码分析 - Action/Result 过滤器(续)
上一篇 看到了Action/Result过滤器的执行顺序:
OnActionExecuting -> Action -> OnActionExecuted -> OnResultExecuting -> View-> OnResultExecuted
这一篇就来做几个例子吧.
一、Demo
上一篇 的代码可能并不怎么好懂. 首先, 我能在FilterConfig中注册过滤器, 可以在Controller中重写Action/Result过滤器或者是在Controller上标注过滤器特性, 还可以在方法上加上过滤器特性. 那么这些过滤器的执行, 都是在上一篇中的方法中执行的. 上一篇中, 并不能直观的看到这些顺序, 也是不好理解的点之一了.
但是上一篇提到过, 在调换顺序之后, 最先执行的应该是Controller里面的过滤器, 那么到底是不是这样呢?来看一下吧.
首先建几个过滤器, 都继承自 ActionFilterAttribute 类, 这里面有Action/Result的四个过滤器方法
//FilterConfig中注册使用
public class MyFilterConfigAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuted<br />");
} public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuting<br />");
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuted<br />");
} public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuting<br />");
}
} //Controller上标注此特性
public class MyControllerAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuted<br />");
} public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuting<br />");
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuted<br />");
} public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuting<br />");
}
} //Action上标注此特性
public class MyActionAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuted<br />");
} public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuting<br />");
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuted<br />");
} public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuting<br />");
}
}
然后就是在控制器和视图.
[MyController]
public class FootController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("FootController - OnActionExecuted<br />");
} protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("FootController - OnActionExecuting<br />");
} protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("FootController - OnResultExecuted<br />");
} protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("FootController - OnResultExecuting<br />");
} [MyAction]
public ActionResult Get()
{
Response.Write("<br /><br />Action 方法被执行<br /><br />");
return View();
}
}
@{
ViewBag.Title = "Get";
}
<br />
<br />
Get - View视图被解析
<br />
<br />
准备妥当了, 上结果:

从以上结果中可以看出, 最先执行的, 是Controller里面的ActionExecuting方法.
这里的执行顺序, 有点类似递归的执行过程. 从这个结果来看上一篇的执行过程, 就很清晰了.
Controller内部Action/Result过滤器 - > FilterConfig注册Action/Result过滤器 - > Controller标注Action/Result特性 - > Action标注Action/Result特性
MVC源码分析 - Action/Result 过滤器(续)的更多相关文章
- MVC源码分析 - Action/Result 过滤器执行时机
前面 的篇章, 解析了Action方法的查找, 以及 Authorize, Action, Result, Error 过滤器的加载时机. 也花了两篇去看授权和错误过滤器的使用. 但是对于 Actio ...
- MVC源码分析 - Authorize授权过滤器
从 上一篇 其实能看到, 程序执行的过滤器, 有四种 : 过滤器类型 接口 描述 Authorization IAuthorizationFilter 此类型(或过滤器)用于限制进入控制器或控制器的某 ...
- MVC源码分析 - Action查找和过滤器的执行时机
接着上一篇, 在创建好Controller之后, 有一个 this.ExecuteCore()方法, 这部分是执行的. 那么里面具体做了些什么呢? //ControllerBaseprotected ...
- asp.net mvc源码分析-Action篇 IModelBinder
我们首先还是看看ReflectedParameterBindingInfo的Binder属性吧: public override IModelBinder Binder { ge ...
- ASP.NET MVC 源码分析(一)
ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 ...
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- 精尽Spring MVC源码分析 - 寻找遗失的 web.xml
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - WebApplicationContext 容器的初始化
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - MultipartResolver 组件
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
随机推荐
- mapnik渲染原理
https://bbs.csdn.net/topics/390853826
- C语言中:static与extern对变量和函数的作用
1.两者对全局变量 static对全局变量,表示定义一个内部变量 extern对全局变量,表示声明一个外部变量 说明: 1.内部变量:定义的变量只能在本文件中访问,不能被其他文件访问. 2.不同文件中 ...
- 王家林系列之scala--第69讲:Scala并发编程react、loop代码实战详解
刚才看了一下,群里王家林老师又更新课程了,真为王老师的勤奋感到佩服,于是迫不及待的下载下来观看学习.本期讲的是关于scala并发编程的react.loop代码实战. 信息来源于 DT大数据梦工厂微信公 ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- Linux-目录与文件
1. pwd - 打印当前工作目录 [root@VM_0_171_centos ~]# pwd /root 2. cd - Change the shell working directory. [r ...
- PCA in MLLib
SVD分解: \(A=U\Sigma V^T\),变换:\(\hat{A}=A\cdot V=U\Sigma\) 分解时先计算\(A^TA=U\Sigma^2U^T\),再进行SVD分解 /** * ...
- MacOS卸载Jenkins安装包
/Library/Application\ Support/Jenkins/Uninstall.command
- 基于emoji 国际通用表情在web上的输入与显示的记录
定义: emoji 即国际通用表情 场景: 1,ios,android,wp上emoji表情输入与显示 2,web也需作为支撑平台对emoji表情就行输入与显示(解析) 问题: 1,app端输入的表情 ...
- 【Junit4】:要点随笔
1. 引入Junit4的Maven依赖 <dependencies> <dependency> <groupId>junit</groupId> < ...
- css 的 conic-gradient 学习
偶然间在微信公众号奇舞周刊上看到了这篇文章<CSS Painting API>,算是对 conic-gradient的初次见面. 后来有空的时候,百度搜了一下,看了这篇文章<CSS神 ...