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

Kma*_*man 191 .net asp.net-mvc razor asp.net-mvc-3

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

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

<h2>About</h2>
<p>
     Put content here.
</p>
Run Code Online (Sandbox Code Playgroud)

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

我看着在global.asaxweb.config,但我不能找出如何将About.cshtml文件"链接"从_ViewStart文件的布局.

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

jim*_*lan 230

来自ScottGu的博客:

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

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

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

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

这样可以实现很多UI灵活性.它还允许您更轻松地编写一次视图逻辑,并避免在多个位置重复它.

也看到这个.

  • 那么它或多或少是MVC3的"硬编码"功能?我没有必要将其更改为另一个"默认"页面,只是好奇它是如何设置的.谢谢你把它全部排序:) (14认同)
  • Kman-硬编码,按照惯例(在此处选择另一个“句柄” :))-是的,完全正确。很高兴它清除了雾 (2认同)
  • 如果您的 Views 文件夹有子文件夹,您可以在每个子文件夹中放置一个 `_ViewStart` 来链接到该子文件夹中的视图吗? (2认同)

ris*_*ism 34

在更一般的意义上,MVC框架"知道"_Viewstart.cshtml的这种能力被称为"按惯例编码".

约定优于配置(也称为按惯例编码)是一种软件设计范例,旨在减少开发人员需要做出的决策数量,获得简单性,但不一定失去灵活性.这个短语实质上意味着开发人员只需要指定应用程序的非常规方面.例如,如果模型中有类Sale,则默认情况下数据库中的相应表称为"sales".只有当一个人偏离这个约定时,比如调用表"products_sold",才需要编写关于这些名称的代码.

维基百科

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

  • 如果MVC知道它,那么Visual Studio为什么不知道并指出这一点呢?如果按照惯例进行编码意味着只要你碰巧没有违反惯例就会有效,那就太糟糕了...... (12认同)
  • 约定优于配置并不意味着你无法改变它.应该配置可用于指定该文件的名称和位置.可能很好,但谁知道它是什么.人们使用"约定优于配置"的口头禅来掩盖代码库中的众多糟糕决策,这让我很生气,因为事后出现的那个人为了保持他们记录不完整的混乱而"正常工作"(但是上帝 - 禁止你改变任何事情 - 你会花几个小时搞清楚你是如何打破一切的. (6认同)
  • @AidenStrydom我不同意.接受的答案实际上告诉我如何使用_ViewStart.这个答案只谈到了一个设计概念.我来到这里是为了获取有关_ViewStart的信息,而不是关于为什么Visual Studio不会告诉我有关_ViewStart的信息. (2认同)

小智 22

只是另一个想法.

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

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

@{Layout = "~/Views/Shared/_Layout.cshtml";}
Run Code Online (Sandbox Code Playgroud)


Fri*_*der 12

源代码比文档更好地查找它.

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

---- ----更新

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

---- /更新----

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

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

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


rad*_*vus 6

这可能会立即向此问题添加一些其他信息(2016年ala MVC4,MVC5)。

Razor引擎会在_ViewStart.cshtml中找到并运行该代码,然后再在与_ViewStart.cshtml相同的目录或子目录中找到任何其他代码。

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

只是想我可能会添加更多信息来向您展示为什么它是_ViewStart。

如果获得ILSpy并检查RazorViewEngine(System.Web.Mvc.dll)中的代码,您将看到代码本身引用了该名称。

_ViewStart在System.Web.Mvc.dll中

您会看到RazorViewEngine正在查找具有以下名称的文件:

razorviewengine代码

RazorViewEngine.ViewStartFileName = "_ViewStart";
Run Code Online (Sandbox Code Playgroud)

  • 这就是我一直在寻找的东西,我讨厌“不知道”项目中正在发生的事情,因为我也正在为VS做自己的模板,而这个刚从空中出来的文件很难理解 (3认同)