上一篇 看到了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 过滤器(续)的更多相关文章

  1. MVC源码分析 - Action/Result 过滤器执行时机

    前面 的篇章, 解析了Action方法的查找, 以及 Authorize, Action, Result, Error 过滤器的加载时机. 也花了两篇去看授权和错误过滤器的使用. 但是对于 Actio ...

  2. MVC源码分析 - Authorize授权过滤器

    从 上一篇 其实能看到, 程序执行的过滤器, 有四种 : 过滤器类型 接口 描述 Authorization IAuthorizationFilter 此类型(或过滤器)用于限制进入控制器或控制器的某 ...

  3. MVC源码分析 - Action查找和过滤器的执行时机

    接着上一篇, 在创建好Controller之后, 有一个 this.ExecuteCore()方法, 这部分是执行的. 那么里面具体做了些什么呢? //ControllerBaseprotected ...

  4. asp.net mvc源码分析-Action篇 IModelBinder

    我们首先还是看看ReflectedParameterBindingInfo的Binder属性吧: public override IModelBinder Binder {            ge ...

  5. ASP.NET MVC 源码分析(一)

    ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 ...

  6. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证

    原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...

  7. 精尽Spring MVC源码分析 - 寻找遗失的 web.xml

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  8. 精尽Spring MVC源码分析 - WebApplicationContext 容器的初始化

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  9. 精尽Spring MVC源码分析 - MultipartResolver 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

随机推荐

  1. leetcode - [5]Insertion Sort List

    Sort a linked list using insertion sort. 思路:插入排序 #include <iostream> using namespace std; stru ...

  2. sdut 3916

    这道题就是二分枚举加贪心,小蓝书上一开始就讲的,但是我给忘了,很难受 #include <iostream> #include <cstdio> #include <cs ...

  3. handsontable 排序问题

    排序是表格的基础功能,handsontable也会支持. 有时需求会很复杂,需要自定义排序,或者调用其他排序方法:自定义排序,比较复杂,没做过:今天要用的是调用R中的排序方法. 有两个事件before ...

  4. js五星评分

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. UIKit Dynamic主题学习笔记

    1.重力效果:UIGravityBehavior @IBOutlet weak var frogImage: UIImageView! //创建一个关联到view的动画(必须为全局变量) lazy v ...

  6. Oracle EBS主界面的Top Ten List

    http://blog.csdn.net/pan_tian/article/details/7749128 Top Ten List的数据保存在表FND_USER_DESKTOP_OBJECTS中,登 ...

  7. .NET Core 微服务之grpc 初体验(干货)

    Grpc介绍 GitHub: https://github.com/grpc/grpc gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计 ...

  8. 【转】老左常用国内/国外VPS推荐

    原文:http://www.laozuo.org 老左从使用虚拟主机到VPS,至今也用过不少的商家产品,比如在"TOP10美国虚拟主机/网站空间推荐"有分享目前和曾经使用的虚拟主机 ...

  9. How do I convert an IIR filter into a FIR filter in digital signal processing?

    Maybe you were asking if there is some kind of design tool allowing to convert an IIR filter into an ...

  10. C++获取系统信息(IP地址、硬件信息等)

    #include<stdio.h> #include<winsock2.h> //该头文件需在windows.h之前 #include<windows.h> #in ...