ASP.NET MVC _viewstart.cshtml的作用
MVC中 _ViewStart.cshtml 布局文件
在ASP.NET MVC 3.0及更高版本中,用Razor模板引擎新建项目后,Views目录下会出现一个这样的布局文件:_ViewStart.cshtml。
- _ViewStart.cshtml 文件的作用:一般是用于存放MVC网站中所有视图公用的js,css等文件。这样就不需要在每个视图中都拖一个js,css等文件进来了。
- MVC中执行任何一个视图之前都要先执行Views文件夹下的 _ViewStart.cshtml 视图的内容,主要用于一些不方便或不能在母版(_Layout.cshtml)中进行的统一操作,譬如你有很多个没有继承关系的母版或不使用母版的单页;
- 在 _ViewStart.cshtml我们可以定义一些参数或做一些判断,定义过程和语法和普通的页面没有任何差别;
- 注意,是在View被呈现的时候【在action方法中必须以return View()来返回视图】才会调用_Viewstart.cshtml,如果一个View是按照PartialView的方式输出的,则不会触发_Viewstart.cshtml中的代码;
- 如果在View的某个目录下(例如Home目录)也有一个同名的_ViewStart.cshtml文件,那么这个_ViewStart也会被调用,但是最先调用的还是最外面的_ViewStart,然后再是Home目录下的_ViewStart。
Razor中的LayOut
转载 : https://www.cnblogs.com/joeylee/p/3866144.html
当客户端请求 /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源码,就能看到执行的顺序了