程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC的Razor引擎:View編譯原理

ASP.NET MVC的Razor引擎:View編譯原理

編輯:關於ASP.NET

通過.cshtml或者.vbhtml文件定義的View能夠被執行,必須先被編譯成存在於某個程序集的類型,ASP.NET MVC采用動態編譯的方式對View文件實施編譯。當我們在對ASP.NET MVC進行部署的時候,需要對.cshtml或者.vbhtml文件進行打包。針對某個View的第一次訪問會觸發針對它的編譯,一個View對應著一個類型。我們可以對.cshtml或者.vbhtml進行修改,View文件修改後的第一次訪問將會導致View的再一次編譯。和ASP.NET 傳統的編譯方式一樣,針對View的編譯默認是基於目錄的,也就是說同一個目錄下的多個View文件被編譯到同一個程序集中。

為了讓讀者對ASP.NET MVC對View文件的編譯機制具有一個深刻的認識,我們通過一個簡單的實例來確定View文件最終都被編譯成什麼類型,所在的程序集又是哪一個。我們在一個ASP.NET MVC應用中為HtmlHelper定義了如下一個擴展方法ListViewAssemblies,該方法用於獲取當前被加載的包含View類型的程序集(程序集名稱以“App_Web_”為前綴)。

   1: public static class HtmlHelperExtensions
2: {
3: public static MvcHtmlString ListViewAssemblies(this HtmlHelper helper)
4: {
5: TagBuilder ul = new TagBuilder("ul");
6: foreach(var assembly in AppDomain.CurrentDomain.GetAssemblies().Where(a=>a.FullName.StartsWith("App_Web_")))
7: {
8: TagBuilder li = new TagBuilder("li");
9: li.InnerHtml = assembly.FullName;
10: ul.InnerHtml+= li.ToString();
11: }
12: return new MvcHtmlString(ul.ToString());
13: }
14: }

然後我們定義了如下兩個Controller類型(FooController和BarController),它們之中各自定義了兩個Action方法Action1和Action2。

   1: public class FooController : Controller
2: {
3: public ActionResult Action1()
4: {
5: return View();
6: }
7: public ActionResult Action2()
8: {
9: return View();
10: }
11: }
12: 
13: public class BarController : Controller
14: {
15: public ActionResult Action1()
16: {
17: return View();
18: }
19: public ActionResult Action2()
20: {
21: return View();
22: }
23: }

接下來我們為定義在FooController和BarController的四個Action創建對應的View(對應文件路為:“~/Views/Foo/Action1.cshtml”、“~/Views/Foo/Action2.cshtml”、“~/Views/Bar/Action1.cshtml”和“~/Views/Bar/Action2.cshtml”)。它們具有如下相同的定義,我們在View中顯示自身的類型和當前加載的基於View的程序集。

   1: <div>當前View類型:@this.GetType().AssemblyQualifiedName</div>
2: <div>當前加載的View程序集:</div>
3: @Html.ListViewAssemblies()

現在運行我們的程序並在浏覽器中通過輸入相應的地址“依次”(“Foo/Action1”、“Foo/Action2”、“Bar/Action1”和“Bar/Action2”)訪問定義在FooController和BarController的四個Action,四次訪問得到的輸出結果下圖所示。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved