ASP.NET MVC 視圖(二)
前言
上篇中對(duì)于視圖引擎只是做了簡(jiǎn)單的演示,對(duì)于真正的理解視圖引擎的工作過程可能還有點(diǎn)模糊,本篇將會(huì)對(duì)由MVC框架提供給我們的Razor視圖引擎的整個(gè)執(zhí)行過程做一個(gè)粗略的講解,目的在于讓大家對(duì)Razor視圖引擎的執(zhí)行過程留個(gè)印象以便聯(lián)想的思考到視圖引擎的作用以及視圖在MVC框架中的表示。
ASP.NETMVC 視圖
l 自定義視圖引擎
l Razor視圖引擎執(zhí)行過程
l Razor視圖的依賴注入、自定義視圖輔助器
l 分段、分部視圖的使用
l Razor語法、視圖輔助器
Razor視圖引擎執(zhí)行過程
大家看過上個(gè)篇幅對(duì)試圖引擎的執(zhí)行過程有個(gè)大概的了解,而Razor視圖引擎的執(zhí)行則更為詳細(xì),不會(huì)像上篇這么粗糙,來看一下示意圖,圖1.
圖1
圖1中所示的是Razor視圖引擎中的對(duì)象結(jié)構(gòu)的繼承關(guān)系,對(duì)于圖1右邊部分的意思則是表示視圖引擎是從系統(tǒng)的ViewEngines.Engines也就是ViewEngineCollection集合類型中取出來的,在ViewEngineCollection下面部分則是表示Razor試圖引擎的一個(gè)繼承關(guān)系示意圖。
圖2
我們先來看紅色指針?biāo)覆糠值牧鞒蹋?/p>
在我們使用ViewResult作為控制器方法的返回類型的時(shí)候,MVC框架會(huì)首先執(zhí)行ViewResult中的FindView()方法,而在ViewResult的FindView()中并不是由它自身來執(zhí)行查找視圖的任務(wù)的,MVC框架很多管閑事,它會(huì)干擾進(jìn)來。它會(huì)從系統(tǒng)的ViewEngines.Engines也就是ViewEngineCollection集合類型中取出來Razor試圖引擎來執(zhí)行查找視圖的任務(wù)【圖1中例舉了Razor視圖引擎的繼承結(jié)構(gòu)】。
隨之由VirtualPathProviderViewEngine類型來執(zhí)行查找視圖的任務(wù),實(shí)際在這里根據(jù)視圖名稱查找的并不是我們定義的xxxx.cshtml視圖文件,而是由xxxx.cshtml文件編譯成的cs文件,這些cs文件中表示對(duì)應(yīng)視圖的代碼,這個(gè)在本篇的最后會(huì)有講解,那么這些cs文件是在什么時(shí)候生成的呢?是在請(qǐng)求到達(dá)控制器的時(shí)候,好事的MVC框架就會(huì)把View文件夾下或者是對(duì)應(yīng)區(qū)域的View文件夾下,關(guān)于這個(gè)控制器文件夾中的所有視圖都會(huì)統(tǒng)統(tǒng)的編譯生成為cs文件。
扯蛋扯遠(yuǎn)了回到主題,在VirtualPathProviderViewEngine類型找到視圖后【cs文件】,便會(huì)讓RazorViewEngine類型來生成視圖處理類,也就是實(shí)現(xiàn)了IView的RazorView類型了并且封裝到ViewEngineResult類型實(shí)例中。
下面我們就來說明下藍(lán)色指針?biāo)覆糠值牧鞒蹋?/p>
這個(gè)時(shí)候MVC框架會(huì)調(diào)用ViewEngineResult類型中的View屬性中的Render()方法,實(shí)則就是剛剛上面說的RazorView類型實(shí)例中的方法。
然后我們看圖2,在Render()方法的執(zhí)行過程中,首先是由BuildManagerWrapper類型根據(jù)視圖的路徑去讀取文件并且動(dòng)態(tài)編譯過后返回視圖cs文件中所表示的類型,這里BuildManagerWrapper類型是MVC框架的內(nèi)部類型是實(shí)現(xiàn)了內(nèi)部的IBuildManager接口,BuildManagerWrapper類型的意思就是對(duì)于動(dòng)態(tài)編譯功能的一個(gè)封裝,實(shí)則就是調(diào)用System.Web.Compilation.BuildManager里的功能。
回到主題,類型生成好了過后是由DefaultViewPageActivator類型來生成視圖所對(duì)應(yīng)的C#類型【System.Web.Mvc.WebViewPage<dynamic>】,最后通過RazorView類型中的RenderView()方法來對(duì)剛剛我們生成好的視圖對(duì)應(yīng)的C#類型進(jìn)行基礎(chǔ)性的賦值,比如說從ViewContext類型參數(shù)中獲取ViewData、ViewBag等等數(shù)據(jù)信息【ViewContext類型繼承自ControllerContext,所以你懂的】進(jìn)行賦值。
最后會(huì)被WebPageRenderingBase類型的對(duì)象來做渲染處理,這部分內(nèi)容就不做闡述了。
以上就是多Razor視圖引擎也就是ViewResult類型的處理過程,說的很粗糙大家見諒希望能對(duì)大家對(duì)于視圖的理解上有所幫助。
下面來說一下由MVC框架對(duì)于視圖文件編譯后的cs文件,要眼見為實(shí)嘛對(duì)吧。
首先我們看一下某個(gè)視圖的運(yùn)行的結(jié)果,圖3.
圖3
而對(duì)應(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> }
那么在請(qǐng)求達(dá)到控制器過后編譯后的視圖cs文件存在哪了呢?
在系統(tǒng)的C:\Users\你系統(tǒng)的用戶名\AppData\Local\Temp\Temporary ASP.NET Files中,當(dāng)然了并不是在這個(gè)文件夾下面,而是在會(huì)這里又生成一些其它的亂七八糟名稱的文件夾,找一個(gè)即可。
我就是在C:\Users\你系統(tǒng)的用戶名\AppData\Local\Temp\Temporary ASP.NETFiles\root\19537580\dfb4a136文件夾下找的,當(dāng)然了cs文件的命名也不是對(duì)應(yīng)著視圖名稱的,一般是由App_Web開頭命名的。經(jīng)過一番查找找到了對(duì)應(yīng)代碼1-1的cs文件了,來看一下,代碼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> // 此代碼由工具生成。 // 運(yùn)行時(shí)版本:4.0.30319.1008 // // 對(duì)此文件的更改可能會(huì)導(dǎo)致不正確的行為,并且如果 // 重新生成代碼,這些更改將會(huì)丟失。 //</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 } } }
想必看到這里大家清楚了吧,對(duì)于視圖文件cshtml、vbhtml等等最后在運(yùn)行時(shí)編譯成的類型System.Web.Mvc.WebViewPag,至于類型后面的泛型類型是dynamic類型是對(duì)應(yīng)于普通視圖,而強(qiáng)類型視圖編譯后的類型就會(huì)將此處的dynamic類型替換成強(qiáng)類型視圖的ViewModel類型了,最后說一下對(duì)于#line的意思可問度娘,是便于我們調(diào)試用的。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:ASP.NETMVC視圖(二)-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://muchs.cn/article46/dgceeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站排名、做網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容