在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該在的都在的話,一個請求過來,服務器的處理如下
由於個人認識尚淺,故上面有什么說錯的說漏的還請各位指出,謝謝!