當客戶端請求 /Product/Index的時候, 如果在視圖的根目錄下有 _ViewStart.Cshtml 就會先執行這個,再去執行 Product文件夾下的Index視圖, 如果Product文件夾下也有 _ViewStart.Cshtml文件,那么優先執行這個文件,再去執行 Index視圖
根目錄下的ViewStart中的數據,可以通過 Page.Title這樣 或者是 PageData[“key”] 這樣傳遞給 下面的Product下的ViewStart視圖,直至到目標 Index視圖
如果根目錄下的ViewStart文件中指定了 LayOut為 默認視圖的話
那么也就表示,后續的子視圖,都會采用這個Layout屬性,當然了,子視圖也可以使用 Layout=null 來清除默認視圖.
我們先去看看這個layout.cshtml默認視圖
注釋:
@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 這樣一個值
2: Product文件夾下 ViewStart.cshtml .由於 Product下的ViewStart文件,並沒有設置 Layout的值,那么這個時候,實際這個Layout值還是根目錄下的ViewStart里面的Layout的值,相當於是直接繼承了過來
3: 目標Product下的 Index.cshtml 視圖文件. 這個目標頁也沒有設置layout屬性,那么也就是表示,是直接從剛才的Product下的Viewstart中繼承這個layout值.
我們index視圖中發現有個 Section節點(名字為Scripts),那么這個節點,就會去回填給 默認的Layout中的那個名字為 Scripts的 Section坑
index視圖,會繼承 根目錄下的ViewStart中的代碼,還會繼承product下的ViewStart的代碼,最后加上除了剛才的Section節點中的內容的代碼,這3者的總和,最后會回填給layout中的RendyBody這個坑.
4:最后回填之后 顯示的效果
打開查看html源碼,就能看到執行的順序了