65.9K
CodeProject 正在变化。 阅读更多。
Home

Razor:MVC视图引擎的秘密大揭秘

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.75/5 (4投票s)

2016年1月26日

CPOL

5分钟阅读

viewsIcon

18658

为什么 _ViewStart.cshtml 文件对理解 MVC 和 Razor ViewEngine 如此重要?本文将向您展示 _ViewStart 文件的魔力,并使用 ILSpy 揭示 MVC 代码的秘密。

引言

MVC 的 _ViewStart.cshtml 文件几乎具有神奇的属性,因为它会在任何其他 View 文件加载之前被加载。  然而,我不知道是什么加载了它,这让我很好奇。  本文将探讨 _ViewStart.cshtml 的作用以及它是如何实现的,以便您能更好地理解 MVC 框架。

背景

在为我的第一篇文章( ASP.NET MVC:构建您自己的博客引擎 (CMS) - 第 1 部分共 2 部分 (自己的 ASP.NET MVC) -- 在新标签页中打开 )研究信息时,我想知道 MVC 框架的哪个确切部分加载了 _ViewStart.cshtml,以便能够正确解释它。  这促使我使用 **ILSpy** 检查 RazorViewEngine(),并产生了这篇文章。

首先,我将向您展示框架中关于这个文件的魔法,然后我将使用 ILSpy 向您展示 MVC 代码。

首先,让我们来看看模板项目是如何神奇地加载布局文件的。

神奇的加载布局

首先,使用 Visual Studio 项目模板启动一个新的 ASP.NET MVC 项目。

选择 ASP.NET Web 应用程序,然后点击 [添加] 按钮。

new mvc template

接下来,选择 MVC 项目类型。

MVC project

点击 [更改身份验证] 按钮以移除该选项。  我们的示例代码不需要它。

remove authentication

将选项设置为“无身份验证”,然后点击 [确定] 按钮。

Visual Studio 将根据其模板创建您的 MVC 项目。

项目创建完成后,立即生成并运行项目。  提示CTRL-F5 即可为您生成并运行。

IIS 开发 Web 服务器将启动,MVC 应用程序将在您的默认浏览器中启动,外观将如下所示:

basic MVC project running

检查导航栏

如果您点击页面顶部的每个菜单项,您会发现无论导航到哪个页面,您都会看到导航栏。  这似乎很合理,但这是怎么做到的呢?

该导航栏的代码位于 \Views\Shared\_Layout.cshtml 文件中。

但是,这个文件是如何应用到您的每一个 View 上的呢?

您的任何 View 都没有实际包含 _Layout.cshtml 文件,它是如何工作的呢?

检查 Views 文件夹

如果您查看解决方案资源管理器并检查 Views 文件夹,您会发现根 \Views 文件夹中有一个名为 _ViewStart.cshtml 的文件。 

魔法文件在项目中没有已知引用

_ViewStart.cshtml 是那个在您的项目或项目文件中没有被任何其他地方引用的魔法文件,但它却能在您的项目中工作

以下是 _ViewStart.cshtml 文件中包含的所有代码列表:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

就是这样。  我想这很合理,因为您可以看到它告诉 RazorViewEngine Layout 应设置为文件:~/Views/Shared/_Layout.cshtml

这很有道理,因为该文件被加载了,并且它负责显示导航栏。

问题:_ViewStart.cshtml 到底是如何被加载的?

关键在于,既然似乎没有任何东西引用 _ViewStart.cshtml,那么它本身是如何被加载的呢?

作为测试,让我们从项目中排除此文件。  在 Visual Studio 中右键单击该文件,然后选择“从项目中排除”菜单项。

exclude a file

完成之后,该文件将消失。

测验:现在会发生什么?

您认为当我们再次运行项目时会发生什么?

继续再次运行项目。  CTRL-F5

测验答案:没有区别

如果您这样做,您会发现项目没有任何区别。  它仍然加载 _Layout.cshtml,导航栏仍然存在。  为什么? 

令人震惊的答案

因为文件被排除了,但文件仍然存在于磁盘上,并且 RazorViewEngine 只是通过名称遍历您的项目来查找该文件,当找到时,它会遵循其指令。

证明

好的,我来证明一下。

使用 Windows Explorer 前往您的项目在磁盘上的位置,然后打开 \Views 文件夹,您将看到 _ViewStart.cshtml 文件。

现在,将文件重命名为任何其他名称。  只需在前面添加一个字母 X,例如,现在它被命名为 X_ViewStart.cshtml

返回 Studio 并再次运行项目:CTRL-F5

现在页面看起来如下所示——没有样式,因为 _Layout.cshtml 不再被加载,并且导航栏消失了

no styles

这一切都发生是因为 RazorViewEngine 会遍历您的项目文件夹,查找这个特殊命名的文件。

如何查看 RazorViewEngine 执行此操作的代码? 

在 MVC 库中查找代码

为了找出 ASP.NET MVC 框架中的代码可能隐藏在哪里,我搜索了以下文本:

razorviewengine dll

第一个结果是到 RazorViewEngine 类 (MSDN 在新标签页中打开) 的链接。

该页面显示了以下关于 RazorViewEngine 的信息:

System.Object
  System.Web.Mvc.VirtualPathProviderViewEngine
    System.Web.Mvc.BuildManagerViewEngine
      System.Web.Mvc.RazorViewEngine

然后我通过 Windows Explorer 进入我当前的 MVC 项目,并向下导航到 bin 目录。  在那里我找到了 System.Web.Mvc.dll,并将其拖入 ILSpy 界面。

获取您的免费 ILSpy 副本

您可以在以下网址获取 ILSpy: http://ilspy.net/ - 在新标签页中打开

之后,我在 **ILSpy** 和 MVC dll 中搜索了文本:_ViewStart

然后我找到了它。

Razor _viewstart string

您还可以在代码中看到 _ViewStart.cshtml 字符串的设置位置:

view start string in library

关注点

我从未在网络上的其他任何地方看到过这样的文档记录。  我认为这很有趣,因为它揭示了魔法是如何运作的,并且有助于我们更好地理解整个 MVC 框架。  希望您也喜欢。

注意:我没有包含任何下载源,因为这仅仅是我们使用的 ASP.NET MVC 模板项目,只做了一些小的修改。

历史

本文初版日期:2015-01-25

© . All rights reserved.