_ViewStart的位置和方式。CSHTML布局文件链接?

这里是关于。cshtml从默认的MVC 3模板:

@{
ViewBag.Title = "About Us";
}


<h2>About</h2>
<p>
Put content here.
</p>

我期望在About.cshtml中找到对_ViewStart文件的引用,但显然不是。

我已经查看了global.asaxweb.config,但我找不到About.cshtml文件如何与_ViewStart文件中的布局“链接”。

一切都按照预期工作,我只是想知道在引擎盖下面发生了什么……

134953 次浏览

ScottGu的博客:

从ASP开始。NET MVC 3 Beta版本,您现在可以添加一个文件 叫_ViewStart。或_ViewStart. cshtml。vbhtml for VB)下的 \项目的视图文件夹:

_ViewStart文件可以用来定义通用视图代码 要在每个视图的渲染开始时执行。例如, 我们可以在_ViewStart中编写代码。CSHTML文件 以编程方式将每个视图的Layout属性设置为 SiteLayout。CSHTML文件默认值:

因为这段代码在每个视图的开始执行,我们不再 需要显式地设置布局在任何我们的个人视图文件 (除非我们想覆盖上面的默认值) 重要:因为_ViewStart。CSHTML允许我们编写代码,我们 可以选择使我们的布局选择逻辑更丰富,而不仅仅是一个 基本属性集。例如:我们可以改变布局模板 我们使用取决于什么类型的设备访问网站- 为这些设备设计一个优化布局的手机或平板电脑 桌面优化布局的pc /笔记本电脑。或者如果我们在建造一个 CMS系统或跨多个客户使用的公共共享应用程序 我们可以根据客户(或客户)选择使用不同的布局

.他们的角色) 这使得UI具有很大的灵活性。它还允许你做更多 轻松地编写视图逻辑一次,并避免重复多次 的地方。< / p >

也可参见

只是另一个想法。

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

在你的_viewstart.cshtml中,你可以提到你的公共cshtml文件。

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

从更广泛的意义上讲,MVC框架的这种“知道”的能力;关于_Viewstart。cshtml被称为“按惯例编码”。

约定优于配置(也称为按约定编码) 一种软件设计范式,它寻求减少的数量 开发人员需要做出的决策,获得了简单性,但没有 必然失去灵活性。这个短语本质上是指a 开发商只需要指定非常规的方面 应用程序。例如,如果模型中有一个类Sale,则 数据库中对应的表默认称为“sales”。它 只有当一个人偏离了这个惯例,如调用 表" products_sold ",我们需要写关于这些的代码 名字。< / p >

维基百科

没有什么神奇的。它刚刚被写进MVC框架的核心代码库,因此是MVC“知道”的东西。有关。这就是为什么你在.config文件或其他地方找不到它;它实际上在MVC代码中。但是,您可以重写以更改或取消这些约定。

在源代码中查找这些信息比在文档中查找要好得多。

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

——更新

由于源结构的变化,关于如何收集视图开始页的信息现在可以在RazorViewEngine.cs查找"GetViewStartPages"函数中找到。

——/更新

要回答它们是如何发挥作用的,请查看RazorView,我相信(因为IView)它是绑定在MVC管道中的。这个文件有一个RenderAsync方法,可以从MVC管道中调用来呈现所请求的视图。

RenderAsync调用RenderPage然后RenderLayout(注意顺序)。 RenderPage首先调用viewstart文件(注意复数,可能有多个_viewstart文件)。< / p >

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

这可能会为这个问题增加一些附加信息(2016 ala MVC4, MVC5)。

Razor引擎在找到_ViewStart.cshtml所在目录或子目录的任何其他代码之前找到并运行_ViewStart.cshtml中的代码。

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

只是想我可能会添加一些信息来告诉你为什么它是_ViewStart。

如果你得到ILSpy并检查RazorViewEngine (System.Web.Mvc.dll)中的代码,你会看到代码本身引用了这个名字。

_ViewStart in System.Web.Mvc.dll

你可以看到RazorViewEngine在寻找这个名称的文件:

razorviewengine code

RazorViewEngine.ViewStartFileName = "_ViewStart";
如果你想为你的页面有一个公共布局,你需要定义公共布局,并将一个视图与布局相关联,我们必须在每个视图上设置布局属性,这违反了DRY(不要重复自己)原则。 为此. net框架提供了“_ViewStart. net”Cshtml”文件,放置在视图文件夹中。 我们将布局信息放在“_ViewStart”中。Cshtml”文件,每个视图默认使用这个布局信息。 如果你想给一些不同的布局信息,让我们假设你的Home视图,你可以创建一个新的“_ViewStart”。

. cshtml",并将其放在"Home View"文件夹中
< p > 简单的答案是: ViewStarts在渲染任何视图时首先启动。长话短说如下:

创建单个视图文件的故事:

  1. ViewStart与ViewImports合并,然后作为单个文件执行。注意,ViewImports总是与任何cshtml文件合并,包括ViewStart文件。它的目的是抽象@using语句和其他常用指令。
  2. ViewStart的输出(例如Layout和ViewData)对特定的View文件可用。
  3. 在View文件中,如果Layout变量为/为空,则会呈现视图主体,并将最终输出传递给用户。
  4. 如果Layout变量为/不为空,则执行将移动到布局文件中,该文件将与ViewImports合并为单个文件,然后在布局文件中的@RenderBody()语句中执行将移动到视图文件中,该文件再次与ViewImports合并,输出将与@RenderBody()位置的布局文件合并,最终输出最终交付给用户。

希望这能让您了解程序生命周期中未知的秘密中到底发生了什么。