ASP.NET MVC笔记
ASP.NET MVC的應用程序生命周期還是跟原來ASP.NET WebForm一樣沒有區別,只是引入MVC后,加了一個UrlRoutingModule模塊,該模塊用來捕獲應用程序生命周期中的PostResolveRequestCache事件,當事件觸發時然后選擇合適的IHttpHandler來處理請求
那是如何獲取IHttpHandler的呢,我們在Global.asax的Application_Start事件中寫routes.MapRoute注冊路由時,會給路由對象Route創建一個MvcRouteHandler,該對象調用GetHttpHandler方法返回MvcHandler 對象用來處理接下來的操作。我們看到這個處理程序已經不是原來WebForm時的Page了。
獲取完IHttpHandler后應用程序生命周期繼續往下執行,經過一些事件后最后終于觸發了CallHandlerExecutionStep,也就是之前創建的MvcHandler開始要接手處理了,它將會完成接下來的控制器方法執行,以及視圖查找和呈現,核心東西都在這里了,所以要好好來分析下。
MvcHandler是一個IHttpAsyncHandler,它是一個異步的,因此它不是執行ProcessRequest方法了,取而代之的是BeginProcessRequest和EndProcessRequest方法。在BeginProcessRequest內部通過調用RequestContext.RouteData獲取controller控制器的名字,接下來ControllerFactory根據前面獲取的控制器名稱來創建controller實例。
接下來MvcHandler執行EndProcessRequest方法,controller實例調用Execute方法,內部通過另一個方法ExecuteCore執行核心操作。該方法中包含了很多的執行步驟,首先調用PossiblyLoadTempData(),控制器上下文ControllerContext判斷當前請求是否IsChildAction來決定是否加載TempData數據,如果是ChildAction則不加載。
然后RouteData 獲取當前Action的方法名,ControllerActionInvoker調用InvokeAction方法,在InvokeAction方法中執行我們在Controller中定義的方法,執行方法的前后后我們可以注冊過濾器,以讓我們在執行action的前后做一些自己想做的事情。所以第一步要做的是獲取所有注冊過濾器,這些過濾器信息獲取后存在一個叫FilterInfo對象中,其中包含了AuthorizationFilters,ActionFilters,ResultFilters ,接下來調用方法GetParameterValues(controllerContext, actionDescriptor)來獲取action的參數。
調用InvokeActionMethodWithFilters方法執行action和actionfilters,這順序一般是OnActionExecuting->ActionMethod->OnActionExecuted。這邊主要講ActionMethod方法因為它才真正代表了我們Controller中那些Action所執行的代碼。獲取Action參數值,封裝ActionMethodDispatcher里面包含我們要執行的action的MethodInfo信息,ActionMethodDispatcher? 執行Execute進而進入到action的執行,當執行完action通常返回一個ActionResult 這里我們讓其返回一個ViewResult(ActionResult的一個子類),當然還有其他ActionResult ,譬如JsonResult,JavaScriptResult,FileResult,EmptyResult等等,而ViewResult 表示我們要向客戶端呈現的是一個視圖,通常是我們在Views文件夾下建的那些.aspx文件,當然不一定是.aspx,不同的視圖引擎實現不一樣。當我們寫下return View()即表示返回一個ViewResult ,內部調用的是重載的方法View(string viewName, string masterName, object model)方法,你也可以直接調用該方法,順便傳入視圖名等其他信息,調用new ViewResult{iewName = viewName,? MasterName = masterName, ViewData = ViewData, TempData = TempData},然后返回該對象。執行完ActionMethod后來個OnActionExecuted操作收尾。
調用InvokeActionResultWithFilters方法執行result和resultfilters,這順序一般是OnResultExecuting->ResultExecut->OnResultExecuted。這邊主要講ResultExecut因為它涉及到視圖的查找與呈現,其中視圖的呈現類似原來WebForm下Page的執行過程。
調用ViewResult 的FindView方法查找視圖。內部通過ViewEngineCollection?? 的FindView來實現。ViewEngineCollection 是一個視圖引擎的集合,在MVC3中包含了兩個視圖引擎WebFormViewEngine和RazorViewEngine, 查找的過程會先獲取Controller的名稱,然后結合ViewName,找到視圖所在的路徑字符串,創建一個View對象,其中屬性
ViewPath即為之前找到的視圖路徑,接著創建ViewEngineResult?? 對象,將View對象賦給ViewResult的View屬性,執行View.Render呈現視圖,根據ViewPathViewPath獲取視圖實例(Page對象),執行Page對象的ProcessRequest方法,這個我想大家都很熟悉了吧,哈哈。
最后釋放視圖,退出ResultExecute,這樣視圖的呈現就結束了。
執行OnResultExecuted。調用PossiblySaveTempData保存TempData數據。到這里Controller就執行完成了,退出ExecuteExecute方法,釋放Cotroller對象。然后退出MvcHandler的執行,繼續應用程序生命周期接下來的那些事件。
轉載于:https://www.cnblogs.com/fuyun2000/archive/2013/04/27/3046153.html
總結
以上是生活随笔為你收集整理的ASP.NET MVC笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse配置了maven,项目报错
- 下一篇: HTML5学习笔记三