服務(wù)熱線
153 8323 9821
一個Url請求經(jīng)過了Routing處理后會調(diào)用Controller的Action方法. 中間的過程是怎樣的? Action方法中返回ActionResult對象后,如何到達(dá)View的? 本文將講解Controller的基本用法, 深入分析Controller的運(yùn)行機(jī)制, 并且提供了創(chuàng)建所有類型Action的代碼. 值得學(xué)習(xí)ASP.NET MVC時參考.
在上一篇文章中, 我已經(jīng)學(xué)會了如何使用Routing獲取Controller和Action, 隨后的程序會調(diào)用Controller中的Action方法.
每個Action方法都要返回一個ActionResult對象. 一個Action會將數(shù)據(jù)傳遞給View,如圖:
Controller負(fù)責(zé)將獲取Model數(shù)據(jù)并將Model傳遞給View對象.通知View對象顯示.
在ASP.NET MVC中, 一個Controller可以包含多個Action. 每一個Action都是一個方法, 返回一個ActionResult實(shí)例.
ActionResult類包括ExecuteResult方法, 當(dāng)ActionResult對象返回后會執(zhí)行此方法.
發(fā)送請求 –> UrlRoutingModule捕獲請求 –> MvcRouteHandler.GetHttpHandler() –> MvcHandler.ProcessRequest()
使用工廠方法獲取具體的Controller –> Controller.Execute() –> 釋放Controller對象
獲取Action –> 調(diào)用Action方法獲取返回的ActionResult –> 調(diào)用ActionResult.ExecuteResult() 方法
獲取IView對象-> 根據(jù)IView對象中的頁面路徑獲取Page類-> 調(diào)用IView.RenderView() 方法(內(nèi)部調(diào)用Page.RenderView方法)
通過對MVC源代碼的分析,我們了解到Controller對象的職責(zé)是傳遞數(shù)據(jù),獲取View對象(實(shí)現(xiàn)了IView接口的類),通知View對象顯示.
View對象的作用是顯示.雖然顯示的方法RenderView()是由Controller調(diào)用的,但是Controller僅僅是一個"指揮官"的作用, 具體的顯示邏輯仍然在View對象中.
需要注意IView接口與具體的ViewPage之間的聯(lián)系.在Controller和View之間還存在著IView對象.對于ASP.NET程序提供了WebFormView對象實(shí)現(xiàn)了IView接口.WebFormView負(fù)責(zé)根據(jù)虛擬目錄獲取具體的Page類,然后調(diào)用Page.RenderView().
通過上面的流程,我們知道了ActionResult對象在整個流程中的作用.ActionResult是一個抽象類, 在Action中返回的都是其派生類.下面是我整理的ASP.NET MVC 1.0 版本中提供的ActionResult派生類:
| 類名 | 抽象類 | 父類 | 功能 | ContentResult | 根據(jù)內(nèi)容的類型和編碼,數(shù)據(jù)內(nèi)容. | EmptyResult | 空方法. | FileResult | abstract | 寫入文件內(nèi)容,具體的寫入方式在派生類中. | FileContentResult | FileResult | 通過 文件byte[] 寫入文件. | FilePathResult | FileResult | 通過 文件路徑 寫入文件. | FileStreamResult | FileResult | 通過 文件Stream 寫入文件. | HttpUnauthorizedResult | 拋出401錯誤 | JavaScriptResult | 返回javascript文件 | JsonResult | 返回Json格式的數(shù)據(jù) | RedirectResult | 使用Response.Redirect重定向頁面 | RedirectToRouteResult | 根據(jù)Route規(guī)則重定向頁面 | ViewResultBase | abstract | 調(diào)用IView.Render() | PartialViewResult | ViewResultBase | 調(diào)用父類ViewResultBase 的ExecuteResult方法. 重寫了父類的FindView方法. 尋找用戶控件.ascx文件 | ViewResult | ViewResultBase | 調(diào)用父類ViewResultBase 的ExecuteResult方法. 重寫了父類的FindView方法. 尋找頁面.aspx文件 |