zoukankan      html  css  js  c++  java
  • MVC源码分析

    上一篇 看到了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特性

    目录已同步

  • 相关阅读:
    10.汇编语言--伪指令(offset、prt、lengthof)
    9.汇编语言--算数运算,标记寄存器
    8.汇编语言--数据传输指令mov等
    7.汇编语言--定义数据类型、数组
    6.汇编语言--汇编基本元素、寄存器、内存初步调试
    5.汇编语言--输入输出
    4.汇编语言--更为简便的使用win32-api
    3.汇编语言--x86处理器架构
    微信小程序获取input输入框里面的value值
    学习微信小程序遇到的坑 ---跳转
  • 原文地址:https://www.cnblogs.com/elvinle/p/6339460.html
Copyright © 2011-2022 走看看