類似于2.0版本中的MasterPage主版頁面框架,不過mvc3.0推出的RazorView內建的主版頁面語法與原本的webFormview的MasterPage相差甚遠
1,Razor的頁面執行順序
當controller 回傳ViewResult給MvcHandler(用mh代替)之后,mh會先設法找到對應的檢視頁面view,當找到了對應的razor頁面之后,會進入頁面執行生命周期,在Razor頁面的執行過程中有個固定的執行順序。
被mh找到的razor頁面會優先執行,執行完畢后,會檢查這個view頁面是否含有主版頁面所需要的Layout屬性,如果有的話便試圖載入Layout屬性指定的Razor主版頁面,找到主版頁面后悔開始將內容響應給用戶端,
在過去的MasterPage中,執行的時候會先找到ContentPlaceHolder控制項,并將之前主要頁面的執行結果填入后輸出到用戶端eg<標簽asp: ContentPlaceHolder ID="MainContent" runat="server"/>
實務上:在溝通的時候會把MasterPage定義為一個區塊的動作戲稱為“挖洞”,也就是在MasterPage里挖了一個洞,然后由主要頁面的內容填入。
在razor里當主版頁面被載入后,執行的過程也一樣,在razor主版頁面里也會定義出一些需要被填入的的內容(挖洞),然后讓主要頁面的內容填入。
2,關于_Layout主版頁面。
預設的Views/Shared/_Layout.cshtml文件其實和一般的razor檢視頁面差不多,同樣是razor語法,但不同的地方是有兩個Razor語法,分別是@RenderBody,@RenderSection這兩段聲明,就是所謂的挖洞宣言
@RenderBody()在主版頁面中可視為“預設挖洞”,也就是主要的View頁面在沒有特別聲明的情況下,所有內容都會被填入到@RenderBody()這個位置。
@RenderSection在Razor主版頁面中被視為“具名坑洞”,
@RenderSection(“featured”,required:false)意思就是我們在主版頁面中定義一個叫featured的坑洞,第二個是required具名參數則是聲明這個坑洞是否必須被填滿,如果在主版頁面設定的具名坑洞把required參數設定為true的話,那么所有載入這個主版頁面的view頁面都必須輸出想對應的內容,否則就會發生狀況。
注意:由于razor頁面有其執行順序,主要是先執行view再執行Layout主版頁面,因為view與layout共用一個viewDataDictionary實體,因此,如果要將數據傳遞到layout頁面中一樣可以通過viewData或者viewBag的方式傳遞過去,但是千萬別以為可以從layout傳數據回view頁面,因為執行順序是不一樣的。