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

posted @ 2014-07-24 17:35  梨花驿路  阅读(3393)  评论(0编辑  收藏  举报