一般我們用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開始的。