在MVC3中的視圖部分,Razor視圖引擎是與以往不同的地方之一,使用Razor的視圖文件再也不是以往的ASPX文件了,是cshtml文件,在新建視圖的時候也會發現增加多了幾類文件
由上到下分別是
- ? ? ? ? ?MVC 3 Layout Page:與原來Web Form的Master母版頁一樣。文件名一般以下劃線“_”開頭
- ? ? ? ? ?MVC 3 Partial Page:用于定義用戶控件的。文件名一般以下劃線“_”開頭。
- ? ? ? ? ?MVC 3 View Page:普通的View頁面。
- ? ? ? ? ?MVC 3 View Page with Layout:使用某個Layout頁面的View,與原本WebForm中使用母版頁的頁面一樣。
上面兩項文件的文件名默認是以下劃線開頭的“_”,不過在MVC 3中有幾個帶有下劃線開頭的文件比較特殊
- _AppStart.cshtml
- _PageStart.cshtml
- _ViewStart.cshtml
這幾個文件在整個請求響應流程中發揮著一些特殊的效果。這些文件都不能夠被請求(即使控制器的行為定義好了、路由也定義好了,都不行),但行為定義好的路由定義好而不能訪問的頁面也不知這幾個,作為Layout的頁面里萬一用了@RenderBody()就不允許被請求了。當然感覺這樣做鉆牛角尖了。
分別看一下上面幾個特殊的文件的介紹
?
_AppStart.cshtml
執行時機:在程序啟動的時候執行,但晚于全局文件Global.asax里面的Application_Start事件執行。
作用:用于進行App的初始化時,需要進行處理的內容,但是由于其所處于的作用域跟Application_Start所處的不同。所以它能作出一些Application_Start做不出的事。
注意:此文件一定要位于根目錄才會生效,否則不會執行。
這里就列舉一下
_AppStart.cshtml
@{this.App.StartMessage = "測試_AppStart.cshtml"; } <br />@("applicationstart")
?
TestPage.cshtml
@{ViewBag.Title = "123ABCD";if(!string.IsNullOrEmpty( App.StartMessage)){ Response.Write(App.StartMessage);}}
這里的App屬于動態屬性,VS的自動提示不起作用,要想知道是什么就只能上官網了,ViewBag都是這樣。
同時從結果都可以看出@("applicationstart")并沒有執行,只是執行了@{}這部分。
?
_ViewStart.cshtml
執行時機:單個View處理Request時執行,晚于_AppStart.cshtml執行
作用:與Web Form中的Page_Load類似,不過Web Form的Page_Load只能作用于一個頁面,這個_ViewStart.cshtml能作用于它所在的目錄及子目錄中所有視圖。如果子目錄中也有_ViewStart.cshtml的話,先從最頂級的執行,才逐級執行到子級里頭。不過如果行為方法返回的不是View(),而是PartialView()的話,這個_ViewStart就不會執行了。
?
下面也給一個例子,多個_ViewStart一齊使用的
?
文件結構如下
外面的_viewStart.cshtml的代碼只是一行就夠了
<br/> @("ViewStart.cshtml")
System目錄下的_viewStart.cshtml的代碼也只有一行
<br/>@("SystemViewStart")
運行結果如下
?
_PageStart.cshtml
傳聞這個是跟_ViewStart.cshtml一樣效果
這個文件呢!我沒法作介紹了,因為我用Visual Studio2010的,在這個環境下建了文件沒有執行,一直在苦惱中,在谷歌上找,有不少說明的,都說_AppStart.cshtml執行完畢之后就會執行_PageStart.cshtml,但無論怎樣就是不執行,就算是按照別人的例子放置文件,粘別人的代碼還是不行。后來看了一些雞腸文章,好像_PageStart.cshtml不是在VS用的,在WebMatrix下面用的,看了一篇文章是說由WebMatrix轉到VS的,那堆文件中,轉換前是_PageStart.cshtml,轉換后是_ViewStart.cshtml。
?
最后綜合一下,如果_AppStart.cshtml,_PageStart.cshtml,_ViewStart.cshtml該在的都在的話,一個請求過來,服務器的處理如下
?
由于個人認識尚淺,故上面有什么說錯的說漏的還請各位指出,謝謝!