ASP.NET MVC - Pre-compile Razor VIew

我們都知道 ASP.NET MVCRazor View 中是可以包含 .Net 語法, 在開發的時候,如果我們想要看畫面的執行結果就要執行,如果一不小心在 Razor View 裏頭加入了錯誤的 .Net 語法,這一直要到執行的時候才會看到錯誤訊息,真的是超火大的,以前限量都以為 Razor View 是在 Runtime 才會 Compile,但答案是不一定,因為其實是有方法去設定讓 Razor View 在 Build 的時候就 Compile,今天就要來跟 MVC Razor 的開發者來報個好消息。


先來看看原本令人火大的狀況是怎樣。假設限量今天在 Index 的 View 中打錯了字,我把ViewBag 打成 viewBag,如果是在 cs file 裡打錯那 Build 的時候就會出錯(雖然一開始打錯就會出現提醒),但是整個 View 就是 Build 過了。這時候限量開始執行,就出現錯誤畫面。



可以想像看到這個畫面的表情,接下來應該就是摔鍵盤了吧!

現在,我們先把鍵盤放下來,然後深呼吸一口氣,接著 Follow 限量的指示來做:
1. 先把專案 Unload,然後開啟編輯專案檔。



2. 先搜尋專案檔中是否有 <MvcBuildViews> 的 Tag,可能會有兩種情況。

2-a. 如果有 <MvcBuildViews>,就可以直接修改,<MvcBuildViews>true/false</MvcBuildViews>true 代表開啟 Pre-Compile,反之則填 false。另外你如果想針對不同設定檔來做設定,例如 Debug 時要開啟,Release 時要關閉,這時候就要分別去找 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 與 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">,並在區間裡面設定 MvcBuildViews,如果我要統一設定那就在最上方的 <PropertyGroup> 區間裡加設定。

2-b 如果沒有 <MvcBuildViews>,那就要注意了,因為除了加 2-a 的設定之外,我們還要在最下面的地方加入下列設定:
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

這個地方主要是當我上面的 MvcBuildViews 等於 true 的時候要在 Build 的時期加入 AspNetCompiler Build。

為什麼會有找不到的情況呢?限量發現當我是建立空白的 MVC 專案時就會沒有,如果用範本來建的話就有,但實際是如何可能要再查一下資料了。

學會了這個撇步是不是就不用摔鍵盤了,最後祝大家的鍵盤都可以長命百歲。

參考來源:
StackOverflow - Compile Views in ASP.NET MVC



留言