(一)MVC1版本的ViewEngine
從上圖,我們可以知道:(1)當客戶端發送請求時,DefaultControllerFactory根據RequestContext對象 和ControllerName來生成我們的Controller。Controller的ViewDataDictionary將保存相關的數據,並且通過 ViewEngine傳遞給View。
public virtual IController CreateController(RequestContext requestContext, string controllerName) { Type controllerType = this.GetControllerType(requestContext, controllerName); //type = this.GetControllerTypeWithinNamespaces(requestContext.RouteData.Route, controllerName, namespaces); return this.GetControllerInstance(requestContext, controllerType); } protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return (IController) Activator.CreateInstance(controllerType);//反射 }
(2)在我們以前的MVC版本中,Controller擁有ViewEngine的屬性。我們先看下下述的代碼: ViewEngine依據ViewContext,ViewLocator怎麼處理View以及響應客戶端??
public void RenderView(ViewContext viewContext) { string viewLocation = ViewLocator.GetViewLocation(viewContext, viewContext.ViewName);//根據ViewContext以及相關內容獲取view的相對文件路徑 string viewPath = viewContext.HttpContext.Request.MapPath(viewLocation););//獲取view 的絕對文件路徑 string viewTemplate = File.ReadAllText(viewPath);//讀取文件內容 IRenderer renderer = new PrintRenderer(); viewTemplate = renderer.Render(viewTemplate, viewContext);//正則表達式處理相應內容, 難點! viewContext.HttpContext.Response.Write(viewTemplate);//發送響應到客戶端 }
從上面的代碼中,我們能夠清晰的看到,總體框架就是這麼赤裸裸的“請求--->響應 ”。雖然代碼是過去版本的,但是依舊能夠使我們比較容易的理解整個過程的細節。
關於以前版本的 自定義ViewEngine請參考http://blog.maartenballiauw.be/post/2008/05/Creating-a-custom-ViewEngine- for-the-ASPNET-MVC-framework.aspx