EF5+MVC4系列(10) mvc的布局頁面 _ViewStart.Cshtml


當客戶端請求 /Product/Index的時候, 如果在視圖的根目錄下有 _ViewStart.Cshtml 就會先執行這個,再去執行 Product文件夾下的Index視圖, 如果Product文件夾下也有 _ViewStart.Cshtml文件,那么優先執行這個文件,再去執行 Index視圖

根目錄下的ViewStart中的數據,可以通過 Page.Title這樣 或者是 PageData[“key”] 這樣傳遞給 下面的Product下的ViewStart視圖,直至到目標 Index視圖

如果根目錄下的ViewStart文件中指定了 LayOut為 默認視圖的話

image

那么也就表示,后續的子視圖,都會采用這個Layout屬性,當然了,子視圖也可以使用 Layout=null 來清除默認視圖.

我們先去看看這個layout.cshtml默認視圖

image

注釋:

@RenderSection("scripts", required: false)  表示,在 父模板中,占了一個坑,這個坑是由子模板去填的,最后會把子模板中的數據,放到這里來.

@RenderBody  這是主要的坑,在子視圖中的除了上面  RenderSection中的數據外的其他的代碼,都會填在這里來.

 

下面我們回到 根目錄下的 ViewStart.cshtml ,我們看看如何從 根目錄下的這個視圖,傳遞數據到最后的  Product下的 Index視圖.並且看看,如果在根目錄下的ViewStart.cshtml中有代碼,並且在Product文件夾下的ViewStart也有代碼,那么到最后的目標視圖 index中也有代碼, 這3種代碼是如何排序的?

答案是,依次進行  比如 根Viewstart中有的代碼,會排在 Product下的viewstart的前面,然后把這2者的代碼,又會帶到 目標Index視圖的前面,最后,把這3者的代碼,回填到ViewStart中指定的  layout.cshtml (默認視圖) 里面的  RendyBody處  (如果在目標index中,有section節點,那么Section節點會回填到 layout.cshtml中的 RenderSection 處)

下面是流程圖

1: 根目錄下的 ViewStart.cshtml   指定了Layout 以及傳遞了 Page.name 這樣一個值

image

2: Product文件夾下 ViewStart.cshtml   .由於 Product下的ViewStart文件,並沒有設置 Layout的值,那么這個時候,實際這個Layout值還是根目錄下的ViewStart里面的Layout的值,相當於是直接繼承了過來

image

3: 目標Product下的 Index.cshtml 視圖文件. 這個目標頁也沒有設置layout屬性,那么也就是表示,是直接從剛才的Product下的Viewstart中繼承這個layout值.

我們index視圖中發現有個 Section節點(名字為Scripts),那么這個節點,就會去回填給 默認的Layout中的那個名字為 Scripts的 Section坑

index視圖,會繼承 根目錄下的ViewStart中的代碼,還會繼承product下的ViewStart的代碼,最后加上除了剛才的Section節點中的內容的代碼,這3者的總和,最后會回填給layout中的RendyBody這個坑.

image

4:最后回填之后 顯示的效果

image

打開查看html源碼,就能看到執行的順序了

 

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM