在ASP.NET MVC專案新一個View,編輯CSHTML時Visual Studio爽快地賞了我一個錯誤:某個關鍵型別同時出現在兩顆組件(DLL)中!
看了兩顆組件名稱,Afa.WebApi是MVC網站的編譯結果,Afa.WebApi.Client則是先前嘗試不同做法時曾短暫加入,現已不再參照,二者不該並存。詭異點在於這個關鍵型別被Controller及Model廣泛使用,若重複出現在不同組件,MVC專案也該出錯,為何在加入CSHTML前編譯、執行完全正常?
檢查MVC的bin目錄,果然發現Afa.WebApi.Client.dll的蹤影,判斷為先前短暫加入參照時所殘留,而Afa.WebApi.dll與Afa.WebApi.Client.dll意外並存,就是CSHTML抱怨型別重複出現的根源。至於為什麼組件並存只影響CSHTML,原本MVC專案還是可以順利編譯?仔細想想不難理解-關鍵在於二者編譯方式不同!
ASP.NET MVC屬於Web Appplication專案,編譯時要參照哪些組件由csproj列舉項目決定;而CSHTML/Razor採取執行期間動態編譯,像Web Site Project時代的.aspx /.aspx.cs一樣,享有「改完存檔,重新整理網頁就生效」的即時性,而要實現這一點,編譯的參照來源也跟Web Site Project一樣,由放進bin目錄的組件決定。由此編譯行為差異,就不難解釋為何只有CSHTML出錯,Controller/Model未受影響。Case Closed.