MVC3中的视图文件

  在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该在的都在的话,一个请求过来,服务器的处理如下

 

由于个人认识尚浅,故上面有什么说错的说漏的还请各位指出,谢谢!

posted @ 2013-05-31 22:15  猴健居士  阅读(1479)  评论(6编辑  收藏  举报