你的位置:首页 > ASP.net教程

[ASP.net教程]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开始的。