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特性

    目录已同步

  • 相关阅读:
    centos7下编译安装python3.7,且与python2.7.5共存
    Linux下的ctrl常用组合键
    命令 docker rm | docker rmi | docker prune 的差异
    docker操作命令大全和后台参数
    解决Linux下ssh登录后出现 报错 Write failed: Broken pipe 的方法
    在centos7 中docker info报错docker bridge-nf-call-iptables is disabled 的解决方法
    Linux下实现不活动用户登录超时后自动登出
    centos下非yum方式安装docker环境
    Git Error:There is no tracking information for the current branch.
    Vim操作:打开文件
  • 原文地址:https://www.cnblogs.com/elvinle/p/6339460.html
Copyright © 2011-2022 走看看