當用戶端請求 /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源碼,就能看到執行的順序了
轉載于:https://www.cnblogs.com/joeylee/p/3866144.html