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