当前位置: 代码迷 >> VC/MFC >> MVC中Controller跟Action讲解上篇
  详细解决方案

MVC中Controller跟Action讲解上篇

热度:201   发布时间:2016-05-02 03:18:33.0
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开始的。

  相关解决方案