<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引擎:RazorViewEngine

      基于Web Form引擎的WebFormViewEngine和針對Razor引擎的RazorViewEngine都是抽象類型BuildManagerViewEngine的子類,而后者又繼承自VirtualPathProviderViewEngine。在這里我們僅僅對實現在RazorViewEngine中View獲取的邏輯進行簡單介紹。由于Razor引擎下的View通過RazorView對象來表示,而RazorView通過View文件的虛擬路徑來構建,所以RazorViewEngine的View獲取機制在于根據當前上下文找到與指定View名稱相匹配的View文件(.cshtml或者.vbhtml文件),然后根據該 View文件的虛擬路徑創建一個RazorView對象并最終封裝成ViewEngineResult對象返回。[本文已經同步到《How ASP.NET MVC Works?》中]

      實現在RazorViewEngine中的目標View文件的搜索是根據一個預定義順序進行的。如果當前請求不是針對某個Area的,下面的列表代表了View的搜索順序:

      • ~/Views/{ControllerName}/{ViewName}.cshtml
      • ~/Views/{ControllerName}/{ViewName}.vbhtml
      • ~/Views/Shared/{ViewName}.cshtml
      • ~/Views/Shared/{ViewName}.vbhtml

      對于針對某個Area的請求,RazorViewEngine會先按照如下的順序對目標View進行搜索。如果在這個列表中沒有成功找到目標View文件,會繼續按照上面的屬性進行搜索。

      • ~/Areas/{AreaName}/Views/{ControllerName}/{ViewName}.cshtml
      • ~/Areas/{AreaName}/Views/{ControllerName}/{ViewName}.vbhtml
      • ~/Areas/{AreaName}/Views/ Shared /{ViewName}.cshtml
      • ~/Areas/{AreaName}/Views/ Shared /{ViewName}.vbhtml

      如果按照上面的搜索順序依然找不目標View文件,RazorViewEngine會根據這個列表創建并返回一個ViewEngineResult對象。這里介紹的View搜索機制不僅僅應用于普通的View文件,還應用于Partial View和布局文件的搜索。

      ViewEngine不僅僅通過FindView/FindPartialView根據當前上下文獲取指定的View,還通過ReleaseView對指定的View進行釋放回收操作。ReleaseView方法在RazorViewEngine的實現很簡單,如果指定的View對象的類型實現IDispose接口,它會直接調用其Dispose方法。下圖所示的UML體現了Razor引擎涉及的相關類型/接口以及它們之間的相互關系。

      image

      在《ASP.NET MVC的Razor引擎:RazorView》一文中我們創建了一個用于模擬RazorView的SimpleRazorView,現在我們為它創建一個對應的RazorViewEngine,我們直接在該實例項目中添加如下一個SimpleRazorViewEngine。
         1: public class SimpleRazorViewEngine: IViewEngine
         2: {
         3:     private string[] viewLocationFormats = new string[] { 
         4:         "~/Views/{1}/{0}.cshtml", 
         5:         "~/Views/{1}/{0}.vbhtml", 
         6:         "~/Views/Shared/{0}.cshtml", 
         7:         "~/Views/Shared/{0}.vbhtml" };
         8:     private string[] areaViewLocationFormats = new string[] { 
         9:         "~/Areas/{2}/Views/{1}/{0}.cshtml", 
        10:         "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
        11:         "~/Areas/{2}/Views/Shared/{0}.cshtml", 
        12:         "~/Areas/{2}/Views/Shared/{0}.vbhtml" };
        13:     
        14:     public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        15:     {
        16:         return FindView(controllerContext, partialViewName, null, useCache);
        17:     }
        18:  
        19:     public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        20:     {
        21:         string controllerName = controllerContext.RouteData.GetRequiredString("controller");
        22:         object areaName;
        23:         List<string> viewLocations = new List<string>();
        24:         Array.ForEach(viewLocationFormats, format => viewLocations.Add(string.Format(format, viewName, controllerName)));
        25:         if (controllerContext.RouteData.Values.TryGetValue("area", out areaName))
        26:         {
        27:             Array.ForEach(areaViewLocationFormats, format=>viewLocations.Add(string.Format(format,viewName,controllerName, areaName)));
        28:         }
        29:         foreach (string viewLocation in viewLocations)
        30:         {
        31:             string filePath = controllerContext.HttpContext.Request.MapPath(viewLocation);
        32:             if (File.Exists(filePath))
        33:             {
        34:                 return new ViewEngineResult(new SimpleRazorView(viewLocation), 
        35:                     this);
        36:             }
        37:         }
        38:         return new ViewEngineResult(viewLocations);
        39:     }
        40:  
        41:     public void ReleaseView(ControllerContext controllerContext, IView view)
        42:     {
        43:         IDisposable disposable = view as IDisposable;
        44:         if (null != disposable)
        45:         {
        46:             disposable.Dispose();
        47:         }
        48:     }
        49: }
      我們完全按照上面介紹的路徑順序搜索指定的目標View。簡單起見,我們在對目標View進行搜索時忽略了指定的布局文件名和對ViewEngineResult的緩存。這個自定義的SimpleRazorViewEngine在Global.asax中通過如下的代碼對進行注冊。
         1: public class MvcApplication : System.Web.HttpApplication
         2: {
         3:     protected void Application_Start()
         4:     {
         5:         //其他操作
         6:         ViewEngines.Engines.Clear();
         7:         ViewEngines.Engines.Add(new SimpleRazorViewEngine());
         8:     }
         9: }

      我們定義了如下一個HomeController:

         1: public class HomeController : Controller
         2: {
         3:     public ActionResult Index()
         4:     {
         5:         Contact contact = new Contact 
         6:         { 
         7:              Name             = "張三", 
         8:              PhoneNo          = "123456789", 
         9:              EmailAddress     = "zhangsan@gmail.com" 
        10:         };
        11:         return View(contact);
        12:     }
        13: }
        14:  
        15: public class Contact
        16: {
        17:     [DisplayName("姓名")]
        18:     public string Name { get; set; }
        19:  
        20:     [DisplayName("電話號碼")]
        21:     public string PhoneNo { get; set; }
        22:  
        23:     [DisplayName("電子郵箱地址")]
        24:     public string EmailAddress { get; set; }
        25: }

      我們的View(“~/Views/Home/Index.cshtml”)很簡單。如下面的代碼片斷所示,這是一個Model類型為Contact的強類型View,在該View中我們直接調用HtmlHelper<TModel>的擴展方法EditorForModel將作為Model的Contact對象以編輯模式呈現在一個表單之中。

         1: @model Contact
         2: @{
         3:     ViewBag.Title = Model.Name;
         4: }
         5:  
         6: @using (Html.BeginForm())
         7: { 
         8:     @Html.EditorForModel()
         9:     <input type="submit" value="保存" />
        10: }

      為了驗證我們自定義的SimpleRazorView對布局文件和_ViewStart頁面的支持,我們在“~/Views/Shared/”目錄下定義了如下一個名為“_Layout.cshtml”的布局文件。布局文件的設置通過定義在“~/Views/”目錄下具有如下定義的“_ViewStart.cshtml”文件來指定。

         1: _Layout.cshtml:
         2: <html>
         3:     <head>
         4:         <title>@ViewBag.Title </title>
         5:     </head>    
         6:     <body>
         7:         <h3>編輯聯系人信息</h3>
         8:         @RenderBody()
         9:     </body>
        10: </html>
        11:  
        12: _ViewStart.cshtml:
        13: @{
        14:     Layout = "~/Views/Shared/_Layout.cshtml";
        15: }

      運行我們的程序后會在瀏覽器中呈現如下圖所示的輸出結果,可以看出這和我們直接在Action方法Index中返回一個ViewResult對象沒有什么不同。

      image

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

      posted @ 2012-09-07 08:55  Artech  閱讀(18611)  評論(30)    收藏  舉報
      主站蜘蛛池模板: 精品久久精品久久精品九九| 国产精品1区2区3区在线观看| 亚洲国产精品综合久久网络| 亚洲无av中文字幕在线| 亚洲精品国产综合久久一线| 国产福利片一区二区三区| 国产av一区二区午夜福利| 通许县| 国产免费视频一区二区| 一区二区三区精品自拍视频| 一区二区三区四区自拍视频| 中国女人熟毛茸茸A毛片| 自拍偷自拍亚洲精品熟妇人 | 国产欧美日韩亚洲一区二区三区| 五月开心六月丁香综合色啪| 91香蕉国产亚洲一二三区| 国产高清在线不卡一区| 国产精品免费中文字幕| 久久婷婷丁香五月综合五| 午夜福利国产精品视频| 国产人妻高清国产拍精品| 国产成人免费| 亚洲成年av天堂动漫网站| 国产成人免费永久在线平台| 国产亚洲av嫩草久久| 午夜免费视频国产在线 | 亚洲av成人一区在线| 99久久精品国产一区二区暴力| 人妻日韩精品中文字幕| 亚洲精品国产自在现线最新| аⅴ天堂中文在线网 | 国产在线精品福利91香蕉| 久久久久人妻精品一区三寸| 国产欧美日韩精品丝袜高跟鞋| 亚洲 欧美 综合 在线 精品| 麻豆一区二区三区精品视频| 丁香五月亚洲综合在线| 加勒比无码人妻东京热| 日韩丝袜人妻中文字幕| 亚洲精品专区在线观看| 国内少妇人妻偷人精品视频|