在ASP.NET MVC2中,視圖引擎的職責是根據參數選擇並建立視圖對象,視圖引擎不負責視圖內容的產生工作,視圖內容的產生工作由視圖對象來完成。
在ASP.NET MVC2中,預設情況下,建立自訂的視圖引擎需要實現IViewEngine介面(該介面聲明在System.Web.Mvc命名空間中)。該介面聲明了三個方法,具體代碼如下:
1 public interface IViewEngine
2 {
3 ViewEngineResult FindPartialView(
4 ControllerContext controllerContext,
5 string partialViewName,
6 bool useCache);
7
8 ViewEngineResult FindView(
9 ControllerContext controllerContext,
10 string viewName,
11 string masterName,
12 bool useCache);
13
14 void ReleaseView(
15 ControllerContext controllerContext,
16 IView view);
17 }
18
一般來說,幾乎所有的模版引擎都會使用虛擬路徑進行對視圖檔案的定位,並載入視圖。所以如果我們使用IViewEngine的話,我們就還需要編寫相應的路徑處理代碼。
為了方便這種一般的形式,ASP.NET MVC2提供了一個基類VirtualPathProviderViewEngine,封裝了一些路徑處理常式。
VirtualPathProviderViewEngine類是一個抽象類別。該類包含了各種路徑的查詢範本,可以根據controller和action的值進行查詢查應的視圖檔案。
另外VirtualPathProviderViewEngine類還包含兩個用於建立視圖的方法,這兩個方法是抽像方法,需要我們繼承該類的時候實現這兩個方法。
使用VirtualPathProviderViewEngine類還有一個好處:它會自動的在生產環境下進行緩衝。我們知道視圖檔案是在硬碟上存著的,而進行訪問視圖檔案的IO操作是很費資源的。使用VirtualPathProviderViewEngine類很簡單的解決了這個問題。
總體來說,VirtualPathProviderViewEngine類需要我們關心的類結構聲明如下:
1 public abstract class VirtualPathProviderViewEngine : IViewEngine
2 {
3 public string[] MasterLocationFormats { get; set; }
4 public string[] PartialViewLocationFormats { get; set; }
5 public string[] ViewLocationFormats { get; set; }
6
7 protected abstract IView CreatePartialView(
8 ControllerContext controllerContext,
9 string partialPath);
10
11 protected abstract IView CreateView(
12 ControllerContext controllerContext,
13 string viewPath,
14 string masterPath);
15 }
16
也就是說,繼承VirtualPathProviderViewEngine類需我們提供各種視圖檔案路徑的查詢範本,以及建立視圖的方法。在視圖檔案路徑模板中我們可以使用{0}、{1}的方式分別為Action名稱和Controller名稱提供預留位置。
從上面VirtualPathProviderViewEngine類的結構中我們可以看到,這兩個抽像方法需要返回一個實現了IView介面的類的對象。所以,這裡我們還要實現一個實現IView介面的自訂的視圖對象類。
IView介面的聲明如下:
1 public interface IView
2 {
3 void Render(ViewContext viewContext, TextWriter writer);
4 }
這裡我們只要實現一個Render()方法即可。
Render()方法需要兩個參數:viewContext和writer,這個方法的功能是根據viewContext中的資料產生視圖內容,把產生的內容寫到writer對象中。
全部完成以後我們還要註冊我們自訂的視圖引擎,方法是在Global.asax檔案中的Application_Start()方法中使用ViewEngines類裡的Engines集合來添加我們自訂的視圖引擎。當然,在添加之前我們可以先清理掉ASP.NET MVC預設的視圖引擎。代碼如下:
1 ViewEngines.Engines.Clear();
2 ViewEngines.Engines.Add(new MyViewEngine());