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開始的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM