[ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[2]-獨立View並讓新舊View共存

本篇是承接上篇[ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[1]-加快第一次執行回應速度,事實上使用預編譯(Pre-Compile)方法後,View就不一定要寫在同一個專案中,而且可以與原本的ViewEngine共存,當找不到dll中的View時,找原本放在資料夾下的View,或者反過來,先找原本放在資料夾下的View,找不到時用dll中的View,增加View的使用彈性,這些都可以做到,畢竟這只是System.Web.Mvc.ViewEngine的應用而以。

本篇是承接上篇[ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[1]-加快第一次執行回應速度,事實上使用預編譯(Pre-Compile)方法後,View就不一定要寫在同一個專案中,而且可以與原本的ViewEngine共存,當找不到dll中的View時,找原本放在資料夾下的View,或者反過來,先找原本放在資料夾下的View,找不到時用dll中的View,增加View的使用彈性,這些都可以做到,畢竟這只是System.Web.Mvc.ViewEngine的應用而以。

 

Sample

1.安裝Razor Generator

2.開啟Visual Studio 2010 建立空白方案命名為[PrecompileMvcSample]。

3.在方案中新增ASP.NET MVC 3專案,選擇空白範本,命名為[PrecompileMvcSample.ViewPages]。

4.刪除其他檔案,只留下Views資料夾。

5.新增Home\Index.cshtml,使用母頁為_Layout.cshtml。

6.在Index.cshtml屬性視窗中,在自訂工具上輸入RazorGenerator,有看到產生Index.generated.cs檔案表示設定正確(如圖一)。

註:而要不要在_Layout.cshtml檔案上加自訂工具=RazorGenerator,就看你的策略,本範例的做法是使用Web專案的_Layout.cshtml檔案,在ViewPages中保留_Layout.cshtml檔案只要為了讓工具可以選擇到檔案而以。

image

圖一

 

7.在方案中新增ASP.NET MVC 3專案,選擇空白範本,命名為[PrecompileMvcSample.Web]。

8.加入PrecompileMvcSample.ViewPages專案進入參考。

9.使用NuGet安裝PrecompiledMvcViewEngine組件。

10.更改App_Start\PrecompiledMvcViewEngineStart.cs的Start方法如下代碼:


public static class PrecompiledMvcViewEngineStart
{
    public static void Start()
    {
        var engine = new PrecompiledMvcEngine(Assembly.Load("PrecompileMvcSample.ViewPages"));

        //ViewEngines.Engines.Insert(0, engine);
        ViewEngines.Engines.Add(engine);

        VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
    }
}

註:第5行ViewEngines.Engines的新增順序,關係到View的尋找,ASP.NET MVC 3預設有二個ViewEngine:

1.System.Web.Mvc.WebFormViewEngine

2.System.Web.Mvc.RazorViewEngine

 

用ViewEngines.Engines.Add是在原本的ViewEngine後增加新的ViewEngine,影響是當在Web專案中找到View時,才會找ViewPages專案中的View。

如果用ViewEngines.Engines.Insert(0,engine),則是先找ViewPages專案中的View,找不到才會找Web專案中的View。

 

當然也可建立一個以上的ViewPages專案,新增至ViewEngines.Engines中,缺點嘛,有,增加一點點的View搜尋。

11.建立HomeController,不增加View,編譯後執行,會發現會使用ViewPages專案中的View與Web專案中的_Layout.cshtml。

12.建立Home\Index.cshtml(不加RazorGenerator),編譯後執行,會發現會都使用Web專案中View。

 

使用這個方法,可以讓專案發行後,還是可以增加View,優先使用後來新增的View,增加一點點彈性,當然不把View抽到別的專案也是可以使用本方法,作法是只要改變PrecompiledMvcViewEngineStart.cs中ViewEngines.Engines新增順序就好了,其他不用改。