MVC從Controller到View的呈現
當路由機制已經激活Controller並InvokeAction後,如果返回的是View, 則ViewResult基於View呈現的請求響應機制內部借助MVC提供的View引擎來實現對View的獲取、激活和呈現。
ASP.NET MVC提供的View引擎有兩種,一種是傳統的Web Form引擎(.aspx),另一種那個就是要講的Razor引擎(.cshtml/vbhtml)。
View引擎的核心是ViewEngine對象,它實現IViewEngine接口,IViewEngine定義了兩個FindView和FindPartialView方法,根據指定的ControllerContext、View名稱和布局文件名稱獲取對應的View和PartialView;還有用於釋放View對象的ReleaseView方法。
ViewEngines是一個類型為IViewEngine的ViewEngine的集合,它的靜態只讀屬性Engines的類型是ViewEngineCollection。
ViewEngineCollection中的FindView/FindPartialView方法返回的類型是ViewEngineResult。
ViewEngineResult的只讀屬性View和ViewEngine屬性表示的是找到的View對象和作為調用者的ViewEngine對象。在成功獲取到對應View的情況下這兩個屬性會通過構造函數進行初始化。如果沒有找到相應的View,則將表示搜尋位置的字符串列表傳入另一個構造函數來創建返回的ViewEngineResult,只讀屬性SearchedLocation表示的就是這麽一個搜尋位置列表,如下圖所示(由於WebFormViewEngine排在RazorViewEngine之前,所有前者會被優先使用。):
Razor引擎中的View和ViewEngine對應的類型為RazorView和RazorViewEngine。RazorView對應一個以.cshtml/.vbhtml文件定義的View文件,這樣的文件通過ASP.NET的動態編譯生成一個WebViewPage<TModel>類型。RazorView通過激活的WebViewPage<TModel>對象實現了對View的最終呈現。
MVC從Controller到View的呈現