溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC 視圖(二)

發(fā)布時間:2020-04-07 00:03:38 來源:網(wǎng)絡(luò) 閱讀:1044 作者:jinyuan0829 欄目:編程語言

ASP.NET MVC 視圖()

前言

上篇中對于視圖引擎只是做了簡單的演示,對于真正的理解視圖引擎的工作過程可能還有點模糊,本篇將會對由MVC框架提供給我們的Razor視圖引擎的整個執(zhí)行過程做一個粗略的講解,目的在于讓大家對Razor視圖引擎的執(zhí)行過程留個印象以便聯(lián)想的思考到視圖引擎的作用以及視圖在MVC框架中的表示。

ASP.NETMVC 視圖

l  自定義視圖引擎

l Razor視圖引擎執(zhí)行過程

l  Razor視圖的依賴注入、自定義視圖輔助器

l  分段、分部視圖的使用

l Razor語法、視圖輔助器

Razor視圖引擎執(zhí)行過程

大家看過上個篇幅對試圖引擎的執(zhí)行過程有個大概的了解,而Razor視圖引擎的執(zhí)行則更為詳細(xì),不會像上篇這么粗糙,來看一下示意圖,圖1.

1

ASP.NET MVC 視圖(二)

1中所示的是Razor視圖引擎中的對象結(jié)構(gòu)的繼承關(guān)系,對于圖1右邊部分的意思則是表示視圖引擎是從系統(tǒng)的ViewEngines.Engines也就是ViewEngineCollection集合類型中取出來的,在ViewEngineCollection下面部分則是表示Razor試圖引擎的一個繼承關(guān)系示意圖。

2

ASP.NET MVC 視圖(二)

我們先來看紅色指針?biāo)覆糠值牧鞒蹋?/span>

在我們使用ViewResult作為控制器方法的返回類型的時候,MVC框架會首先執(zhí)行ViewResult中的FindView()方法,而在ViewResultFindView()中并不是由它自身來執(zhí)行查找視圖的任務(wù)的,MVC框架很多管閑事,它會干擾進(jìn)來。它會從系統(tǒng)的ViewEngines.Engines也就是ViewEngineCollection集合類型中取出來Razor試圖引擎來執(zhí)行查找視圖的任務(wù)【圖1中例舉了Razor視圖引擎的繼承結(jié)構(gòu)】。

隨之由VirtualPathProviderViewEngine類型來執(zhí)行查找視圖的任務(wù),實際在這里根據(jù)視圖名稱查找的并不是我們定義的xxxx.cshtml視圖文件,而是由xxxx.cshtml文件編譯成的cs文件,這些cs文件中表示對應(yīng)視圖的代碼,這個在本篇的最后會有講解,那么這些cs文件是在什么時候生成的呢?是在請求到達(dá)控制器的時候,好事的MVC框架就會把View文件夾下或者是對應(yīng)區(qū)域的View文件夾下,關(guān)于這個控制器文件夾中的所有視圖都會統(tǒng)統(tǒng)的編譯生成為cs文件。

扯蛋扯遠(yuǎn)了回到主題,在VirtualPathProviderViewEngine類型找到視圖后【cs文件】,便會讓RazorViewEngine類型來生成視圖處理類,也就是實現(xiàn)了IViewRazorView類型了并且封裝到ViewEngineResult類型實例中。

下面我們就來說明下藍(lán)色指針?biāo)覆糠值牧鞒蹋?/span>

這個時候MVC框架會調(diào)用ViewEngineResult類型中的View屬性中的Render()方法,實則就是剛剛上面說的RazorView類型實例中的方法。

然后我們看圖2,在Render()方法的執(zhí)行過程中,首先是由BuildManagerWrapper類型根據(jù)視圖的路徑去讀取文件并且動態(tài)編譯過后返回視圖cs文件中所表示的類型,這里BuildManagerWrapper類型是MVC框架的內(nèi)部類型是實現(xiàn)了內(nèi)部的IBuildManager接口,BuildManagerWrapper類型的意思就是對于動態(tài)編譯功能的一個封裝,實則就是調(diào)用System.Web.Compilation.BuildManager里的功能。

回到主題,類型生成好了過后是由DefaultViewPageActivator類型來生成視圖所對應(yīng)的C#類型【System.Web.Mvc.WebViewPage<dynamic>】,最后通過RazorView類型中的RenderView()方法來對剛剛我們生成好的視圖對應(yīng)的C#類型進(jìn)行基礎(chǔ)性的賦值,比如說從ViewContext類型參數(shù)中獲取ViewData、ViewBag等等數(shù)據(jù)信息【ViewContext類型繼承自ControllerContext,所以你懂的】進(jìn)行賦值。

最后會被WebPageRenderingBase類型的對象來做渲染處理,這部分內(nèi)容就不做闡述了。

以上就是多Razor視圖引擎也就是ViewResult類型的處理過程,說的很粗糙大家見諒希望能對大家對于視圖的理解上有所幫助。

下面來說一下由MVC框架對于視圖文件編譯后的cs文件,要眼見為實嘛對吧。

首先我們看一下某個視圖的運行的結(jié)果,圖3.

3

ASP.NET MVC 視圖(二)

而對應(yīng)的視圖代碼【cshtml文件中的代碼】,如代碼1-1.

代碼1-1

@{
    ViewBag.Title = "Index";
}
 
<h3>Index</h3>
@foreach (varitem in Model)
{
   <h4>ID: @item.ID Name:@item.Name</h4>
}


那么在請求達(dá)到控制器過后編譯后的視圖cs文件存在哪了呢?

在系統(tǒng)的C:\Users\你系統(tǒng)的用戶名\AppData\Local\Temp\Temporary ASP.NET Files中,當(dāng)然了并不是在這個文件夾下面,而是在會這里又生成一些其它的亂七八糟名稱的文件夾,找一個即可。

我就是在C:\Users\你系統(tǒng)的用戶名\AppData\Local\Temp\Temporary ASP.NETFiles\root\19537580\dfb4a136文件夾下找的,當(dāng)然了cs文件的命名也不是對應(yīng)著視圖名稱的,一般是由App_Web開頭命名的。經(jīng)過一番查找找到了對應(yīng)代碼1-1cs文件了,來看一下,代碼1-2

代碼1-2

#pragma checksum "E:\JY\JY\Action\ASP.NETMVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml""{406ea660-64cf-4c82-b6f0-42d48172a799}""11002EF3288CEAD21A96AC68FD35C045"
//------------------------------------------------------------------------------
//<auto-generated>
//     此代碼由工具生成。
//     運行時版本:4.0.30319.1008
//
//     對此文件的更改可能會導(dǎo)致不正確的行為,并且如果
//     重新生成代碼,這些更改將會丟失。
//</auto-generated>
//------------------------------------------------------------------------------
 
namespace ASP {
    usingSystem;
    usingSystem.Collections.Generic;
    usingSystem.IO;
    using System.Linq;
    usingSystem.Net;
    usingSystem.Web;
    usingSystem.Web.Helpers;
    usingSystem.Web.Security;
    usingSystem.Web.UI;
    usingSystem.Web.WebPages;
    usingSystem.Web.Mvc;
    usingSystem.Web.Mvc.Ajax;
    usingSystem.Web.Mvc.Html;
    usingSystem.Web.Routing;
    
    
    public class _Page_Views_iocdemo_Index_cshtml: System.Web.Mvc.WebViewPage<dynamic> {
        
#line hidden
 
        
        public_Page_Views_iocdemo_Index_cshtml() {
        }
        
        protectedASP.global_asax ApplicationInstance {
            get{
                return((ASP.global_asax)(Context.ApplicationInstance));
            }
        }
        
        public override voidExecute() {
 
            
            #line 1 "E:\JY\JY\Action\ASP.NETMVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
  
    ViewBag.Title = "Index";
 
 
            
            #line default
            #line hidden
WriteLiteral("\r\n<h3>Index</h3>\r\n");
 
 
            
            #line 6 "E:\JY\JY\Action\ASP.NETMVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
 foreach (var item in Model)
{
 
            
            #line default
            #line hidden
WriteLiteral("  <h4>ID: ");
 
 
            
            #line 8 "E:\JY\JY\Action\ASP.NETMVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
      Write(item.ID);
 
            
            #line default
            #line hidden
WriteLiteral(" Name:");
 
 
            
            #line 8 "E:\JY\JY\Action\ASP.NETMVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
                    Write(item.Name);
 
            
            #line default
            #line hidden
WriteLiteral("</h4>\r\n");
 
 
            
            #line 9 "E:\JY\JY\Action\ASP.NETMVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
}
            
            #line default
            #line hidden
 
        }
    }
}


想必看到這里大家清楚了吧,對于視圖文件cshtmlvbhtml等等最后在運行時編譯成的類型System.Web.Mvc.WebViewPag,至于類型后面的泛型類型是dynamic類型是對應(yīng)于普通視圖,而強類型視圖編譯后的類型就會將此處的dynamic類型替換成強類型視圖的ViewModel類型了,最后說一下對于#line的意思可問度娘,是便于我們調(diào)試用的。

 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI