_ViewStart.cshtml布局文件在何处以及如何链接?

时间:2012-02-15 19:59:08

标签: .net asp.net-mvc asp.net-mvc-3 razor

这是默认MVC 3模板中的About.cshtml:

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

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

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

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

一切都按预期工作,我只想知道引擎盖下发生了什么......

8 个答案:

答案 0 :(得分:223)

来自ScottGu's blog

  

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

     

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

     

因为此代码在每个View的开头执行,所以我们不再   需要在任何单个视图文件中显式设置布局   (除非我们想覆盖上面的默认值)。

     

重要说明:因为_ViewStart.cshtml允许我们编写代码,所以我们   可以选择使我们的布局选择逻辑比仅仅更丰富   基本属性集。例如:我们可以改变布局模板   我们根据访问网站的设备类型使用 -   并为这些设备提供手机或平板电脑优化布局,以及   针对PC /笔记本电脑的桌面优化布局。或者如果我们正在构建一个   跨多个客户使用的CMS系统或通用共享应用程序   我们可以根据客户选择不同的布局(或者   他们的角色)访问网站时。

     

这可以实现很多UI灵活性。它还允许您更多   轻松编写一次视图逻辑,避免重复多次   地方。

另见this

答案 1 :(得分:33)

在更一般的意义上,MVC框架“知道”_Viewstart.cshtml的能力被称为"Coding by convention".

  

约定配置(也称为按惯例编码)是   寻求减少数量的软件设计范例   开发人员需要做出的决定,获得简单,但不是   必然失去灵活性。这句话基本上意味着一个   开发人员只需要指定非常规方面   应用。例如,如果模型中有类Sale,则   默认情况下,数据库中的相应表称为“sales”。它   只有当一个人偏离这个惯例时,例如调用   表“products_sold”,需要编写有关这些的代码   名。

维基百科

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

答案 2 :(得分:21)

再想一想。

如果您想将自己的cshtml文件作为常用模板,可以这样做

_viewstart.cshtml中,您可以提及您的常见cshtml文件。

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

答案 3 :(得分:12)

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

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

---- ----更新

由于源结构更改,现在可以在RazorViewEngine.cs查找&#34; GetViewStartPages&#34;中找到有关如何收集viewstart页面的信息。功能

---- /更新----

要回答它们如何发挥作用,请查看RazorView,我相信(因为IView)与MVC管道相关联。此文件具有RenderAsync方法,该方法从MVC管道调用以呈现请求的视图。

RenderAsync调用RenderPage和THEN RenderLayout(注意ORDER)。 RenderPage首先调用处理viewstart文件(注意复数,可能有多个_viewstart文件)。

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

答案 4 :(得分:5)

这可能会为此问题添加一些补充信息(2016 ala MVC4,MVC5)。

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

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

答案 5 :(得分:1)

如果你想为你的页面建立一个共同的布局你需要定义公共布局并将视图与布局相关联我们必须在每个视图上设置布局属性,这违反了DRY(不要重复自己) )原则。 为此,.Net Framework提供了“_ViewStart.cshtml”文件,放在视图文件夹中。 我们将布局信息放在“_ViewStart.cshtml”文件中,默认情况下每个视图都使用此布局信息。 如果您想提供一些不同的布局信息,让我们假设您的主页视图,您可以参考该布局创建一个新的“_ViewStart.cshtml”并将其放在“Home View”文件夹中。

答案 6 :(得分:0)

简短的答案是: 呈现任何视图时,ViewStarts首先开始。详细内容如下:

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

  1. ViewStart与ViewImports合并,然后作为单个文件执行。请注意,ViewImports始终与任何cshtml文件(包括ViewStart文件)合并。其目的是抽象@using语句和其他常见指令。
  2. ViewStart的输出(例如Layout和ViewData)可用于特定的View文件。
  3. 在View文件中,如果Layout变量为/变为null,则呈现视图的主体并将最终输出传递给用户。
  4. 如果Layout变量为/变为非null,则将执行移至布局文件,然后将其与ViewImports合并为单个文件,然后在布局文件内的@RenderBody()语句处将执行移回至再次与ViewImports合并的视图文件,并且输出与@RenderBody()位置处的布局文件合并,最终输出最终传递给用户。

希望这使您知道程序生命周期中未知的谜团到底发生了什么。

答案 7 :(得分:-2)

我也遇到同样的问题,后来发现管道中缺少app.UseStaticFiles();

添加到管道后,它可以正常工作。