在MVC3中的视图部分,Razor视图引擎是与以往不同的地方之一,使用Razor的视图文件再也不是以往的ASPX文件了,是cshtml文件,在新建视图的时候也会发现增加多了几类文件
由上到下分别是
- MVC 3 Layout Page:与原来Web Form的Master母版页一样。文件名一般以下划线“_”开头
- MVC 3 Partial Page:用于定义用户控件的。文件名一般以下划线“_”开头。
- MVC 3 View Page:普通的View页面。
- MVC 3 View Page with Layout:使用某个Layout页面的View,与原本WebForm中使用母版页的页面一样。
上面两项文件的文件名默认是以下划线开头的“_”,不过在MVC 3中有几个带有下划线开头的文件比较特殊
- _AppStart.cshtml
- _PageStart.cshtml
- _ViewStart.cshtml
这几个文件在整个请求响应流程中发挥着一些特殊的效果。这些文件都不能够被请求(即使控制器的行为定义好了、路由也定义好了,都不行),但行为定义好的路由定义好而不能访问的页面也不知这几个,作为Layout的页面里万一用了@RenderBody()就不允许被请求了。当然感觉这样做钻牛角尖了。
分别看一下上面几个特殊的文件的介绍
_AppStart.cshtml
执行时机:在程序启动的时候执行,但晚于全局文件Global.asax里面的Application_Start事件执行。
作用:用于进行App的初始化时,需要进行处理的内容,但是由于其所处于的作用域跟Application_Start所处的不同。所以它能作出一些Application_Start做不出的事。
注意:此文件一定要位于根目录才会生效,否则不会执行。
这里就列举一下
_AppStart.cshtml
@{this.App.StartMessage = "测试_AppStart.cshtml"; } <br />@("applicationstart")
TestPage.cshtml
@{ViewBag.Title = "123ABCD";if(!string.IsNullOrEmpty( App.StartMessage)){ Response.Write(App.StartMessage);}}
这里的App属于动态属性,VS的自动提示不起作用,要想知道是什么就只能上官网了,ViewBag都是这样。
同时从结果都可以看出@("applicationstart")并没有执行,只是执行了@{}这部分。
_ViewStart.cshtml
执行时机:单个View处理Request时执行,晚于_AppStart.cshtml执行
作用:与Web Form中的Page_Load类似,不过Web Form的Page_Load只能作用于一个页面,这个_ViewStart.cshtml能作用于它所在的目录及子目录中所有视图。如果子目录中也有_ViewStart.cshtml的话,先从最顶级的执行,才逐级执行到子级里头。不过如果行为方法返回的不是View(),而是PartialView()的话,这个_ViewStart就不会执行了。
下面也给一个例子,多个_ViewStart一齐使用的
文件结构如下
外面的_viewStart.cshtml的代码只是一行就够了
<br/> @("ViewStart.cshtml")
System目录下的_viewStart.cshtml的代码也只有一行
<br/>@("SystemViewStart")
运行结果如下
_PageStart.cshtml
传闻这个是跟_ViewStart.cshtml一样效果
这个文件呢!我没法作介绍了,因为我用Visual Studio2010的,在这个环境下建了文件没有执行,一直在苦恼中,在谷歌上找,有不少说明的,都说_AppStart.cshtml执行完毕之后就会执行_PageStart.cshtml,但无论怎样就是不执行,就算是按照别人的例子放置文件,粘别人的代码还是不行。后来看了一些鸡肠文章,好像_PageStart.cshtml不是在VS用的,在WebMatrix下面用的,看了一篇文章是说由WebMatrix转到VS的,那堆文件中,转换前是_PageStart.cshtml,转换后是_ViewStart.cshtml。
最后综合一下,如果_AppStart.cshtml,_PageStart.cshtml,_ViewStart.cshtml该在的都在的话,一个请求过来,服务器的处理如下
由于个人认识尚浅,故上面有什么说错的说漏的还请各位指出,谢谢!