• MVC中Controller和Action讲解上篇


    一般我们用mvc开发程序时一般需要三个步骤,

        创建模型、创建控制器、创建视图

        之前开发程序都是按照这样的步骤来开发的,也没有想过mvc的原理,比如route是怎么找到controller的,controller又是怎么找到action的,actionResult又是怎么输出到view中去的,

        本篇文章结合自己所学知识讲解controller和action,至于route-->controller-->action这段部分将放在下骗随笔讲解。

       一:controller类执行原理

       当我们新建立一个控制器的时候会发现它是继承Controller类的,而Controller又是继承ControllerBase的,转到ControllerBase的定义如下图

      

       我们发现ControllerBase类是继承IController接口,IControlle接口只有一个Execute方法,而Execute方法在ControllerBase类中已经实现,写了这么多其实可用一句话可以概括

       controller 中一切对请求的处理都是从 Execute 方法开始.

       备注:Controller工厂维护了一个Controller类列表,这个列表类必须满足其中一个条件就是:Controller必须是直接或间接继承

    IController接口,我们创建控制器继承的Controller已经继承了ControllerBase类,ControllerBase类已经继承并实现了IController接口

       我们可以做个demo验证一下:

       

       继承了IController的BasicController类,Controller工厂是可以找到并创建它的实例的,这样一个简单的Controller类就写完了.当时它并不适合在实际项目中适用.

      二:理解ActionResult

        一般我们简单的在Controller中实现一个ActionResult我们通常这样写 

            public ActionResult Index()
            {
                return View();
            }

    mvc将会转到Index视图,可是mvc是怎么做到的呢,我们可以查看ActionResult的定义,

        public abstract class ActionResult
        {
            protected ActionResult();
            public abstract void ExecuteResult(ControllerContext context);
        }
    

    我们发现ActionResult里面有一个可重写的ExecuteResult方法,这个方法就是关键,一旦Controller执行ActionResult方法时,ActionResult类里面的ExecuteResult将会被调用..

    我们做个demo测试一下

        public class CustomReditect : ActionResult
        {
            public string url { get; set; }
    
            //重写ActionResult的ExecuteResult方法
            public override void ExecuteResult(ControllerContext context)
            {
                context.HttpContext.Response.Redirect(url);
            }
        }
    
        public class DefaultController : Controller
        {
            public ActionResult Index()
            {
                return new CustomReditect{url="/Redir/Index"};//这里是关键
            }
        }
    

    最后总结一下Execute和ExecuteResult两个方法:

      一:mvc一切请求都是从execute方法开始的

     二:一切继承ActionResult的类都是从ExecuteResult开始的。

  • 相关阅读:
    jar 反编译工具
    SpringBoot 中注解方式的拦截过滤
    jetty 启动项目在pom.xml 的配置
    java Exception 处理汇总
    mysql-覆盖索引
    程序员为何如此累
    启动centos 不带桌面
    Linux 和 Vim 常用命令整理
    How to Use tomcat on Linux
    Mac Book 问题汇集
  • 原文地址:https://www.cnblogs.com/xuting/p/xuting.html
Copyright © 2020-2023  润新知