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为 默认视图的话

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 @ 2021-03-15 14:20  清语堂  阅读(657)  评论(0编辑  收藏  举报