哪里和如何链接_ViewStart.cshtml布局文件?

以下是来自默认MVC 3模板的About.cshtml:

@{ ViewBag.Title = "About Us"; } <h2>About</h2> <p> Put content here. </p> 

我期望在About.cshtml中可以find对_ViewStart文件的About.cshtml ,但显然不是。

我看了global.asaxweb.config ,但我无法findAbout.cshtml文件如何与About.cshtml文件的布局“链接”。

一切都按预期工作,我只想知道发生了什么事情…

来自ScottGu的博客 :

从ASP.NET MVC 3 Beta版本开始,现在可以在项目的\ Views文件夹下添加一个名为_ViewStart.cshtml(或VB的_ViewStart.vbhtml)的文件:

_ViewStart文件可用于定义在每个视图渲染开始时要执行的常见视图代码。 例如,我们可以在_ViewStart.cshtml文件中编写代码,以编程方式将每个View的Layout属性设置为SiteLayout.cshtml文件:

因为这个代码在每个View开始时执行,所以我们不再需要在任何单独的视图文件中明确地设置Layout(除非我们想覆盖上面的默认值)。

重要提示:因为_ViewStart.cshtml允许我们编写代码,所以我们可以select使布局select逻辑更丰富,而不仅仅是基本的属性集。 例如:我们可以改变我们使用的布局模板,具体取决于什么types的设备访问网站 – 并有一个手机或平板电脑优化这些设备的布局,以及桌面PC /笔记本电脑优化布局。 或者,如果我们正在构build一个用于多个客户的CMS系统或公用共享应用程序,则在访问该网站时,可以根据客户(或其angular色)select不同的布局。

这使得大量的用户界面灵活性。 它还允许您更轻松地编写查看逻辑一次,并避免在多个地方重复。

也看到这个 。

从更一般意义上讲,MVC框架“了解”_Viewstart.cshtml的这种能力被称为“按惯例编码”。

约定优于configuration(也称为惯例编码)是一种软件devise模式,旨在减less开发人员需要做出的决策数量,获得简单性,但不一定会丧失灵活性。 这个短语实质上意味着开发者只需要指定应用程序的非常规方面。 例如,如果模型中有Sale类,则数据库中的相应表格默认称为“sales”。 只有偏离这个惯例,比如调用表“products_sold”,才需要编写关于这些名字的代码。

维基百科

没有什么魔力。 它刚刚被写入MVC框架的核心代码库,因此是MVC“知道”的东西。 那为什么你不在.config文件或其他地方find它; 它实际上是在MVC代码中。 但是,您可以重写以更改或清空这些约定。

只是另一个想法。

如果你想拥有自己的cshtml文件作为通用模板,可以这样做

在你的_viewstart.cshtml你可以提到你的通用cshtml文件。

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

源代码是比文档更好找的地方。

引用Github的MVC 6代码 ,我们有一些感兴趣的文件

—- —-更新

由于源代码结构的变化,现在可以在RazorViewEngine.cs中find这个信息寻找“GetViewStartPages”函数。

—- /更新—-

负责收集_ViewStart文件列表的ViewStartProvider有一个GetViewStartPages函数。 这个函数依赖于ViewStartHierarchyUtility来完成获取viewstart文件列表的工作。 这回答了如何收集viewstart文件。

要回答他们如何发挥作用,看看RazorView ,我相信(因为IView)是绑定到MVCpipe道。 这个文件有一个RenderAsync方法,从MVCpipe道调用来渲染请求的视图。

RenderAsync调用RenderPage然后RenderLayout(注意这个命令)。 RenderPage首先调用处理viewstart文件(注意复数,可能有多个_viewstart文件)。

因此,您可以从Microsoft.AspNet.Mvc.Razor命名空间下的RazorView.cs文件中的RenderViewStartAsync函数获取所需的信息。

这可能会添加一些addt'l信息,现在这个问题(2016 ala MVC4,MVC5)。

Razor引擎在find_ViewStart.cshtml所在的同一目录或子目录中的任何其他代码之前,先在_ViewStart.cshtml中查找并运行代码。

任何视图都可以覆盖Layout属性或其任何值。

如果你想为你的页面设置一个共同的布局,你需要定义一个普通的布局,并且将一个视图和布局联系起来,我们必须在每个视图上设置布局属性,这违反了DRY(Do not Repeat Yourself)原则。 为此.Net Framework提供了放置在视图文件夹内的“_ViewStart.cshtml”文件。 我们将布局信息放置在“_ViewStart.cshtml”文件中,默认情况下每个视图使用这个布局信息。 如果你想给一些不同的布局信息,让我们假设你的主页视图,你可以创build一个新的“_ViewStart.cshtml”参考该布局,并将其放置在“主页视图”文件夹中。