<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

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

      為了讓讀者對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,四次訪問得到的輸出結果下圖所示。

      image

      輸出結果至少可以反映三個問題:

      • ASP.NET MVC對View文件進行動態編譯生成的類型名稱基于View文件的虛擬路徑(比如文件路徑為“~/Views/Foo/Action1.cshtml”的View對應的類型為“ASP._Page_Views_foo_Action1_cshtml”)。
      • ASP.NET MVC是按照目錄進行編譯的(“~/Views/Foo/”下的兩個View文件最終都被編譯到程序集“App_Web_j04xtjsy”中)。
      • 程序集按需加載,即第一次訪問“~/View/Foo/”目錄下的View并不會加載針對“~/View/Bar/”目錄的程序集(實際上此時該程序集尚未生成)。

      我們可以通過BuildManager類型的靜態方法GetCompiledType和GetCompiledAssembly(如下面的代碼片斷所示)根據View文件的虛擬路徑得到對應的類型和程序集。

         1: public sealed class BuildManager
         2: {
         3:     //其他成員
         4:     public static Type GetCompiledType(string virtualPath);
         5:     public static Assembly GetCompiledAssembly(string virtualPath);
         6: }

      在現有演示實例的基礎上我們創建了如下一個HomeController,默認的Action方法Index中通過調用BuildManager的靜態方法GetCompiledType得到并呈現出四個View文件對應的類型名稱。

         1: public class HomeController : Controller
         2: {
         3:     public void Index()
         4:     {
         5:         Response.Write(BuildManager.GetCompiledType("~/Views/Foo/Action1.cshtml") + "<br/>");
         6:         Response.Write(BuildManager.GetCompiledType("~/Views/Foo/Action2.cshtml") + "<br/>");
         7:         Response.Write(BuildManager.GetCompiledType("~/Views/Bar/Action1.cshtml") + "<br/>");
         8:         Response.Write(BuildManager.GetCompiledType("~/Views/Bar/Action2.cshtml") + "<br/>");        
         9:     }
        10: }

      直接運行我們的程序后會在瀏覽器中得到代表四個View文件編譯類型名稱的字符串,具體顯示效果下圖所示。與上圖顯示的View類型名稱相比較,我們會發現它們是一致的。

      image

      上面我們簡單地介紹ASP.NET MVC以目錄為單位的動態View編譯,有人可能會問一個問題:編譯生成的程序集存放在哪里?在默認情況下,View文件被動態編譯后生成的程序集被臨時存放在ASP.NET的臨時目錄“%WinDir%\Microsoft.NET\Framework\{Version No}\Temporary ASP.NET Files\”下,不過我們可以通過如下所示的配置節<system.web>/<compilation>的tempDirectory 屬性來改變動態編譯的臨時目錄。如果我們改變了這個臨時目錄,需要確保工作進程運行帳號具有訪問該目錄的權限。
         1: <configuration>
         2:   <system.web>
         3:     <compilation tempDirectory="c:\Temporary ASP.NET Files\" .../>
         4: </configuration>

      一個寄宿于IIS的Web應用會在上述的臨時目錄下創建一個與Web應用同名的子目錄,所以我們很容易地找到應用對應的編譯目錄。但是對于將Visual Studio Development Server作為宿主的Web應用都會編譯到名稱為Roor的子目錄下。如果這樣的應用太多,我們往往不太容易準確地找到基于某個應用的編譯目錄。有時候我們可以根據目錄最后的修改時間來找到它,但是我個人傾向于直接刪除整個Root目錄,然后運行我們的程序后會重新生成一個只包含該應用編譯目錄的Root目錄。

      對于上面演示的實例,我將Web應用寄宿于IIS下并且命名為MvcApp,我本機的目錄“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\mvcapp\c4ea0afa\
      a83bd407”下可以找到動態編譯的生成的文件。如下圖所示,兩個View目錄(“~/Views/Foo”和“~/Views/Bar”)編譯生成的程序集就在這個目錄下面。

      image

      讀者一定很好奇一個View文件通過動態編譯最終會生成一個怎樣的類型?對應前面演示的實例,我們已經知道了四個View文件編譯生成的類型名稱和所在的程序集,我們只需要通過Reflector打開對應的程序集就能得到View文件編譯類型的定義。如下所示的是View文件“~/Views/Foo/Action.cshtml”編譯后生成的ASP._Page_Views_Foo_Action1_cshtml類型的定義。

         1: [Dynamic(new bool[] { false, true })]
         2: public class _Page_Views_Foo_Action1_cshtml : WebViewPage<object>
         3: {    
         4:     public override void Execute()
         5:     {
         6:         this.WriteLiteral("<div>當前View類型:</div>\r\n<div>");
         7:         this.Write(base.GetType().AssemblyQualifiedName);
         8:         this.WriteLiteral("</div><br/>\r\n<div>當前加載的View程序集:</div>\r\n");
         9:         this.Write(base.Html.ListViewAssemblies());
        10:     }
        11:     
        12:     protected global_asax ApplicationInstance
        13:     {
        14:         get
        15:         {
        16:             return (global_asax) this.Context.ApplicationInstance;
        17:         }
        18:     }
        19: }

       

      ASP.NET MVC的Razor引擎:View編譯原理
      ASP.NET MVC的Razor引擎:RazorView
      ASP.NET MVC的Razor引擎:IoC在View激活過程中的應用
      ASP.NET MVC的Razor引擎:RazorViewEngine

      posted @ 2012-09-04 08:30  Artech  閱讀(27155)  評論(35)    收藏  舉報
      主站蜘蛛池模板: 欧美白妞大战非洲大炮| 亚洲丰满老熟女激情av| 久久亚洲精品天天综合网| 国产成人av大片大片| 蜜芽久久人人超碰爱香蕉| 少妇人妻偷人偷人精品| 思思热在线视频精品| 97se亚洲综合在线天天| 亚洲欧美日韩在线码| 蜜臀av人妻国产精品建身房| 亚洲超碰97无码中文字幕| 榆中县| 色吊丝中文字幕在线观看| 亚洲成在人线AV品善网好看| 伊人色综合久久天天小片| 成人久久精品国产亚洲av| 国精产品自偷自偷ym使用方法| 国产精品一二三中文字幕| 日韩一欧美内射在线观看| 午夜福利国产区在线观看| 国产99视频精品免费视频6| 亚洲另类无码一区二区三区| 亚洲国产成人久久综合一区77| 国产最大成人亚洲精品| 坐盗市亚洲综合一二三区| 国产成人高清亚洲综合| 亚洲中文字幕国产精品| 亚洲最大成人av在线天堂网| 国产精品乱码高清在线观看| 国产欧美日韩免费看AⅤ视频| 亚洲精品自拍区在线观看| 国产一区二区日韩经典| 国产黄色带三级在线观看| 日日爽日日操| 国产粉嫩一区二区三区av| 亚洲WWW永久成人网站| 欧美野外伦姧在线观看| 国产一区二区三区色视频| 日韩av裸体在线播放| 成在人线av无码免费看网站直播| 长岛县|