一.摘要
本文講解ViewEngine的作用, 並且深入解析了實現ViewEngine相關的所有接口和類, 最後 演示了如何開發一個自定義的ViewEngine. 本系列文章已經全部更新為ASP.NET MVC 1.0版本.希望大家多 多支持!
二.承上啟下
首先注意: 我會將大家在MVC之前一直使用的ASP.NET頁面編程模型稱作ASP.NET WebForm編程模型.
上一講中我們已經學習了如何向View傳遞Model, 以及如何在View中使用Model對象. 目前為止我們使 用的都還是ASP.NET WebForm的頁面模型,比如aspx頁面,用戶控件,母版頁等. 最後這些頁面中都要轉換為 HTML代碼. 比如頁面中的內嵌代碼:
<% = ViewData["model"] %>你是否思考過, 為何頁面會支持<% %>這種語法? 為何最後一個aspx頁面會在浏覽器中以HTML代碼的形式展現?
有人會回答這是ASP.NET自帶的語法和功能. 沒有錯, ASP.NET幫我們做了編譯頁面, 輸出HTML, 返回 HTML給客戶端浏覽器等一系列工作.但是這些工作在MVC框架中有很多是屬於View角色的職責. 為了繼續使 用原有的ASP.NET WebForm頁面引擎, ASP.NET MVC抽象出來了ViewEngine這個角色. 顧名思義ViewEngine 即視圖引擎, 其主要作用就是找到View對象, 編譯View對象中的語言代碼(執行語言邏輯), 並且輸出 HTML. 下面講解的WebFormViewEngine就是使用ASP.NET WebForm的頁面編譯/呈現功能實現的.
三.ViewEngine解析
下面將講解和ViewEngine有關的各個接口和類.
IView接口
IView接口是對MVC結構中View對象的抽象, 此接口只有一個方法:
void Render(ViewContext viewContext, TextWriter writer);
Render方法的作用就是展示View對 象, 通常是將頁面HTML寫入到Writer中供浏覽器展示.
在本系列第三篇文章中我曾經分析過, 雖然IView對象是MVC中View角色的抽象, 並且提供了Render方 法, 但是實際上真正的View角色的顯示邏輯在ViewPage/ViewUserControl類中. 這是由於ASP.NET MVC提 供的WebFormViewEngine視圖引擎是使用原有的ASP.NET Web From的頁面顯示機制, 我們無法直接將 WebForm模型中的頁面轉化為IView對象.
於是最後使用了一個折中的辦法:
在IView對象的Render方法中調用WebForm頁面的Render方法. WebFormView是目前ASP.NET MVC中唯一 實現了IView接口的類
所以如果我們使用自定義的ViewEngine引擎, 就可以直接創建一個實現了IView接口的類實現Render方 法.
IViewEngine接口
ViewEngine即視圖引擎, 在ASP.NET MVC中將ViewEngine的作用抽象成了 IViewEngine 接口.
雖然IViewEngine的職責是尋找View對象, 但是其定義的兩個方法:
FindPartialView
FindView
返回的結果是ViewEngineResult對象, 並不是View對象. 我們可以將 ViewEngineResult理解為一次查詢的結果, 在ViewEngineResult對象中包含有本次找到的IView對象.
ASP.NET MVC 提供了下面兩個實現了IViewEngine接口的類:
VirtualPathProviderViewEngine