Answers:
从ASP.NET MVC 3 Beta版本开始,您现在可以在项目的\ Views文件夹下添加一个名为_ViewStart.cshtml(对于VB则为_ViewStart.vbhtml)的文件:
_ViewStart文件可用于定义要在每个视图的呈现开始时执行的通用视图代码。例如,我们可以在_ViewStart.cshtml文件中编写代码,以编程方式将每个视图的Layout属性默认设置为SiteLayout.cshtml文件:
因为此代码在每个View的开头执行,所以我们不再需要在任何单个View文件中显式设置Layout(除非我们想覆盖上面的默认值)。
重要提示:因为_ViewStart.cshtml允许我们编写代码,所以我们可以选择使Layout选择逻辑比基本属性集更丰富。例如:根据访问网站的设备类型,我们可以更改所使用的布局模板-并为这些设备提供经过电话或平板电脑优化的布局,并为PC /笔记本电脑提供桌面优化的布局。或者,如果我们要构建供多个客户使用的CMS系统或通用共享应用程序,则在访问网站时,我们可以根据客户(或其角色)选择不同的布局以使用。
这使用户界面具有很大的灵活性。它还使您可以更轻松地一次编写视图逻辑,并避免在多个位置重复。
另请参阅此。
ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();
。结果,我必须将_ViewStart.cshtml文件的副本添加到“〜/ Inspinia / ExampleViews”中,否则它将不会被拾取并且未设置布局。
_ViewStart
在每个子文件夹中放置一个链接到该子文件夹中的视图的子文件夹?
在更一般的意义上,MVC框架“了解” _Viewstart.cshtml的能力称为“按惯例编码”。
约定优于配置(也称为约定编码)是一种软件设计范例,旨在减少开发人员需要做出的决策数量,以简化操作,但不一定会失去灵活性。该短语本质上意味着开发人员只需要指定应用程序的非常规方面。例如,如果模型中有一个Sale类,则默认情况下数据库中的对应表称为“ sales”。仅当有人偏离此约定(例如,将表称为“ products_sold”)时,才需要编写有关这些名称的代码。
维基百科
这没有魔术。它刚刚被写入MVC框架的核心代码库,因此是MVC所“了解”的东西。这就是为什么您无法在.config文件或其他位置找到它的原因;它实际上在MVC代码中。但是,您可以覆盖以更改或取消这些约定。
源代码是比文档更好的地方。
参考Github 的MVC 6代码,我们有一些感兴趣的文件
----更新----
由于源结构的更改,有关如何收集viewstart页面的信息现在可以在RazorViewEngine.cs中找到,以查找“ GetViewStartPages”函数。
---- /更新----
要回答它们如何发挥作用,请查看RazorView,我认为(由于IView)它与MVC管道相关。该文件具有RenderAsync方法,该方法从MVC管道中调用以呈现请求的视图。
RenderAsync调用RenderPage,然后调用RenderLayout(注意顺序)。RenderPage首先进行调用以处理viewstart文件(请注意,复数形式可能有多个_viewstart文件)。
因此,您可以从Microsoft.AspNet.Mvc.Razor命名空间下的RazorView.cs文件中的RenderViewStartAsync函数获取所需的信息。
这可能会立即向此问题添加一些其他信息(2016年MVC4,MVC5)。
Razor引擎会在_ViewStart.cshtml中找到并运行该代码,然后再在与_ViewStart.cshtml相同的目录或子目录中找到任何其他代码。
任何视图都可以覆盖Layout属性或其任何值。
只是想我可能会添加更多信息来向您展示为什么它是_ViewStart。
如果获得ILSpy并检查RazorViewEngine(System.Web.Mvc.dll)中的代码,您将看到代码本身引用了该名称。
您会看到RazorViewEngine正在查找具有以下名称的文件:
RazorViewEngine.ViewStartFileName = "_ViewStart";
简短的答案是:呈现任何视图时,ViewStarts首先启动。长话如下:
创建单个视图文件的故事:
希望这使您知道程序生命周期中未知的谜团到底发生了什么。