在研究第一篇文章《ASP.NET MVC:构建自定义博客引擎(CMS)第一部分》时,产生了一个疑问:ASP.NET MVC框架中究竟是哪个部分加载了_ViewStart.cshtml文件?为了能够清楚地解释这一点,决定深入研究RazorViewEngine(),使用ILSpy工具进行分析,从而撰写了这篇文章。
首先,让来看一看框架中这个文件是如何“神奇”地加载布局文件的。启动一个新的ASP.NET MVC项目,使用Visual Studio的项目模板。选择ASP.NET Web应用程序并点击[添加]按钮。接下来,选择MVC项目类型。点击[更改身份验证]按钮以移除选项——不需要它。将选项设置为无身份验证,然后点击[确定]按钮。Visual Studio将根据模板创建MVC项目。
项目创建完成后,立即构建并运行项目。提示:使用CTRL-F5可以构建并运行项目。IIS开发Web服务器将启动,MVC应用程序将在默认浏览器中启动,看起来可能如下:
如果点击页面顶部的每个菜单项,会发现无论导航到哪个页面,导航栏始终可见。这是合理的,但这是为什么呢?导航栏的代码位于\Views\Shared\_Layout.cshtml文件中。但是,这个文件是如何应用到每一个视图中的呢?视图实际上并没有包含_Layout.cshtml文件,这是如何工作的呢?
如果查看解决方案资源管理器并检查视图文件夹,将看到在根\Views文件夹中有一个名为_ViewStart.cshtml的文件。这个“神奇”的文件在项目或项目文件中的任何其他地方都没有引用,但它确实在项目中起作用。
_ViewStart.cshtml文件的完整代码如下:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
这很有意义,因为可以看到它告诉RazorViewEngine布局应该设置为文件:~/Views/Shared/_Layout.cshtml。这是有意义的,因为那个文件被加载,并且是显示导航栏的那个文件。
这里的重点是,由于_ViewStart.cshtml似乎没有被引用,它是如何被加载的呢?作为一个测试,让从项目中排除这个文件。在Visual Studio中右键单击文件并选择“从项目中排除”菜单项:
完成此操作后,文件将消失。测验:现在运行项目会发生什么?运行项目看看。CTRL-F5。测验答案:没有区别。如果这样做,会发现项目没有区别。它仍然加载_Layout.cshtml,导航栏仍然存在。为什么呢?
因为文件从项目中排除,但文件仍然存在于磁盘上,RazorViewEngine简单地通过项目找到那个文件,并按照它的指令进行操作。
好的,会证明的。转到项目所在的磁盘位置(使用Windows资源管理器),然后打开\Views文件夹,会看到_ViewStart.cshtml文件。现在,重命名该文件为任何其他名称。简单地在前面添加一个字母X,例如,使其现在命名为X_ViewStart.cshtml。
回到工作室并再次运行项目:CTRL-F5。现在页面看起来可能如下——没有样式,因为_Layout.cshtml不再被加载,导航栏消失了。这一切都是因为RazorViewEngine通过项目文件夹,寻找这个特别命名的文件。
要找出代码可能隐藏在ASP.NET MVC框架的哪里,在谷歌上搜索了以下文本:razorviewengine dll。第一个结果是一个链接到RazorViewEngine类(MSDN)。该页面显示了以下关于RazorViewEngine的信息:
System.Object System.Web.Mvc.VirtualPathProviderViewEngine System.Web.Mvc.BuildManagerViewEngine System.Web.Mvc.RazorViewEngine
然后,通过Windows资源管理器进入当前的MVC项目,并进入bin目录。在那里找到了System.Web.Mvc.dll,将其放入ILSpy界面。
可以在以下网址获取ILSpy:http://ilspy.net/
之后,在ILSpy和MVC dll中搜索了文本:_ViewStart。然后找到了它:
还没有在其他地方看到这种文档。认为这很有趣,因为已经暴露了魔法是如何工作的,它帮助更好地理解整个MVC框架。希望也喜欢。