2012-02-15 25 views
168

这里的About.cshtml从默认的MVC 3模板:_ViewStart.cshtml布局文件在哪里和如何链接?

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

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

我预料到_ViewStart文件的引用将在About.cshtml发现,但显然事实并非如此。

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

一切正常,我只是想知道什么是引擎盖下回事...

回答

197

ScottGu's blog

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

的_ViewStart文件可以用来定义普遍的看法代码,您 w^ant在每个View的渲染开始时执行。例如, 我们可以将_ViewStart.cshtml文件中编写代码来 编程设置布局属性为每个视图是默认 SiteLayout.cshtml文件:

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

重要提示:由于_ViewStart.cshtml允许我们编写代码,我们 可以选择使我们的布局选择逻辑更丰富,而不仅仅是基本属性集 。例如:我们可以改变我们使用的布局模板 ,具体取决于访问网站的设备类型 - ,并针对这些设备优化了手机或平板电脑的布局,以及针对个人电脑/笔记本电脑的桌面优化布局。或者,如果我们正在构建一个用于多个客户的 CMS系统或公共共享应用程序 ,则在访问该网站时,我们可以根据客户选择不同的布局来使用它们(或其作用为 )。

这使得用户界面具有很大的灵活性。它还允许你更容易地编写查看逻辑一次,并避免在多个 地方重复它。

另请参阅this

+12

所以它或多或少MVC3的“硬编码”功能?我不需要将其更改为另一个“默认”页面,只是对它的设置感到好奇。谢谢你整理出来:) – Kman 2012-02-15 20:22:43

+1

Kman-硬编码,按惯例(在这里选择另一个'句柄:)) - 所以是的,完全一样。很高兴它清除了雾 – 2012-02-15 20:32:03

+0

它不只是在你的“视图”文件夹,你可能需要它。如果添加自定义RazorViewEngine以将视图组织到其他文件夹中,则还必须将文件包含在这些备用视图文件夹的根目录中。例如,我提出的所有Inspinia模板视图到一个文件夹,并在视图引擎'跑这ViewLocationFormats = ViewLocationFormats.Union(新的字符串[] { “〜/ Inspinia/ExampleViews/{1}/{0} .cshtml”} ).ToArray();'。因此,我不得不将我的_ViewStart.cshtml文件的副本添加到“〜/ Inspinia/ExampleViews”中,否则它不会被拾取,也不会设置布局。 – Triynko 2015-07-08 21:53:48

17

只是另一个想法。

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

在您_viewstart.cshtml那么你可以说你的共同cshtml文件。

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

从更一般的意义上说,MVC框架能够“了解”_Viewstart的这种能力。CSHTML被称为"Coding by convention".

约定优于配置(也称为按规范编码)是 软件设计模式,其目的是降低开发人员需要做的 决定的数量,获得简单,但不 一定损失灵活性。该短语实质上意味着 开发人员只需指定 应用程序的非传统方面。例如,如果模型中有Sale类,则数据库中的 对应表默认称为“sales”。它只有在有一个偏离这个约定的情况下,例如调用 表“products_sold”,需要编写关于这些 名称的代码。

维基百科

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

+7

如果MVC知道它,那么Visual Studio为什么不知道并向我指出这一点?如果按照惯例进行编码意味着只要你碰巧不会违反惯例,东西就会起作用,它就会很糟糕...... – 2013-11-28 10:29:30

+0

不违反惯例是很重要的。 AKAIK Ruby on Rails也遵循这种模式。 – 2013-11-29 22:18:51

+0

+1 Raif。没有必要保护记录不完善的“按惯例编码”。我可以说我的任何后向代码。 “什么?当它达到33时,你没有想到它会崩溃?每个人都知道你跳过了33。”不幸的是,ASP.NET MVC的文档差距很大。唯一的MS文档是自动生成的,没有内部源摘要。 – shannon 2014-03-21 12:16:28

10

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

引用从Github上MVC 6 code,我们有兴趣

---- ----更新

由于源结构变化的一些文件,这些信息现在可以在RazorViewEngine.cs查找发现“GetViewStartPages”功能。

---- /更新----

ViewStartProvider,这是负责收集的_ViewStart文件的列表,有一个函数Ge​​tViewStartPages。该功能取决于ViewStartHierarchyUtility来完成获取viewstart文件列表的工作。这回答了如何收集viewstart文件。

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

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

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

3

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

剃刀引擎查找和运行之前的任何其他代码其是在将_ViewStart.cshtml发现相同的目录或子目录中_ViewStart.cshtml的代码。

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

+1

这就是我一直在寻找的东西,我讨厌“不知道”在我的项目中发生了什么,因为我也在为VS做我自己的模板,而这个从空中出来的文件非常不方便理解 – 2016-02-14 21:30:32

0

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

相关问题