1.首先在執行到Controller里面的action(方法)時,執行到最后會調用一個View()-->此方法是Controller的一個方法
源代碼:


protected internal ViewResult View(){return View(null /* viewName */, null /* masterName */, null /* model */);}
?
?2.然后繼續調用自己的View(參數1,參數2,參數3)帶三個參數的view()???
? ??


protected internal virtual ViewResult View(string viewName, string masterName, object model){if (model != null) {ViewData.Model = model;}return new ViewResult {ViewName = viewName,MasterName = masterName,ViewData = ViewData,TempData = TempData};}
?
?3.在上步View(string viewName, string masterName, object model)執行完畢將數據封裝到ViewResult(ActionResult的子類)中以后MVC會自己調用ViewResult的父類ViewResultBase的ExecuteResult(),方法里面會封裝好viewContext對象,并調用IView接口的Render()方法
???


public override void ExecuteResult(ControllerContext context){if (context == null) {throw new ArgumentNullException("context");}//其中會判斷View()是否有action名,沒有則會默認將"路由里面"的action賦值給ViewNameif (String.IsNullOrEmpty(ViewName)) {ViewName = context.RouteData.GetRequiredString("action");}ViewEngineResult result = null;if (View == null) {result = FindView(context);View = result.View;}TextWriter writer = context.HttpContext.Response.Output;//封裝數據到viewContext上下文中 ViewContext viewContext = new ViewContext(context, View, ViewData, TempData, writer);View.Render(viewContext, writer);//調用IView接口的Render()方法if (result != null) {result.ViewEngine.ReleaseView(context, View);}}
?未完待續...
?4.而IView接口是由BuildManagerCompiledView類實現的,此類乃是一個抽象類,最終是有WebFormView類來繼承并重寫了RenderView方法,最終完成ViewData賦值給ViewPage類的ViewData字典屬性,最后完成輸出顯示
??


public void Render(ViewContext viewContext, TextWriter writer) {if (viewContext == null) {throw new ArgumentNullException("viewContext");}object instance = null;Type type = BuildManager.GetCompiledType(ViewPath);if (type != null) {instance = _viewPageActivator.Create(_controllerContext, type);}if (instance == null) {throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,MvcResources.CshtmlView_ViewCouldNotBeCreated,ViewPath));}RenderView(viewContext, writer, instance);}protected abstract void RenderView(ViewContext viewContext, TextWriter writer, object instance);
?
? 5.WebFormView類來繼承并重寫了RenderView方法,最終完成ViewData賦值給ViewPage類的ViewData字典屬性,最后調用pr方法走完請求管道,頁面生命周期最終完成MVC的數據的呈現? ? ?


//重寫父類的抽象方法 protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance) {ViewPage viewPage = instance as ViewPage;if (viewPage != null) {// RenderViewPage(viewContext, viewPage);return;}ViewUserControl viewUserControl = instance as ViewUserControl;if (viewUserControl != null) {RenderViewUserControl(viewContext, viewUserControl);return;}throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,MvcResources.WebFormViewEngine_WrongViewBase,ViewPath));}private void RenderViewPage(ViewContext context, ViewPage page){if (!String.IsNullOrEmpty(MasterPath)) {page.MasterLocation = MasterPath;}page.ViewData = context.ViewData;//調用ViewPage的RenderView方法,然后調用pr方法走完請求管道,頁面生命周期最終完成MVC的數據的呈現 page.RenderView(context);}
?