.net - _ViewStart.cshtml布局文件在哪里以及如何链接?
这是默认MVC 3模板中的About.cshtml:
@{
ViewBag.Title = "About Us";
}
About
Put content here.
我希望在About.cshtml中可以找到对_ViewStart文件的引用,但显然不是。
我查看了global.asax和web.config,但我无法找到About.cshtml文件如何与_ViewStart文件的布局“链接”。
一切都按预期工作,我只想知道引擎盖下发生了什么......
7个解决方案
214 votes
来自ScottGu的博客:
从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灵活性。 它还允许您更多 轻松编写一次视图逻辑,避免重复多次 地方。
也看到这个。
jim tollan answered 2019-03-21T18:56:55Z
30 votes
在更一般的意义上,MVC框架“知道”_Viewstart.cshtml的这种能力被称为“按惯例编码”。
约定优于配置(也称为按惯例编码) 寻求减少数量的软件设计范例 开发人员需要做出的决定,获得简单,但不是 必然失去灵活性。 这句话基本上意味着一个 开发人员只需要指定非常规方面 应用。 例如,如果模型中有类Sale,则 默认情况下,数据库中的相应表称为“sales”。 它 只有当一个人偏离这个惯例时,例如调用 表“products_sold”,需要编写有关这些的代码 名。
维基百科
这没有什么神奇之处。 它刚刚被写入MVC框架的核心代码库,因此是MVC“知道”的东西。 这就是为什么你没有在.config文件或其他地方找到它; 它实际上是在MVC代码中。 但是,您可以覆盖以更改或取消这些约定。
rism answered 2019-03-21T18:57:38Z
20 votes
只是另一个想法。
如果您想将自己的_viewstart.cshtml文件作为通用模板,可以这样做
在您的_viewstart.cshtml中,您可以提及您的常见cshtml文件。
@{Layout = "~/Views/Shared/_Layout.cshtml";}
user2515392 answered 2019-03-21T18:58:16Z
11 votes
源代码比文档更好地查找它。
从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函数获取您寻找的信息。
Frison Alexander answered 2019-03-21T18:59:33Z
4 votes
这可能会为此问题添加一些附加信息(2016 ala MVC4,MVC5)。
Razor引擎在_ViewStart.cshtml中找到并运行代码,然后在找到_ViewStart.cshtml的同一目录或子目录中的任何其他代码之前。
任何视图都可以覆盖Layout属性或其任何值。
raddevus answered 2019-03-21T19:00:13Z
1 votes
如果你想为你的页面建立一个共同的布局,你需要定义公共布局,并将视图与布局相关联,我们必须在每个视图上设置布局属性,这违反了DRY(不要重复自己)的原则。为此,.Net Framework提供了“_ViewStart.cshtml”文件,放在视图文件夹中。我们将布局信息放在“_ViewStart.cshtml”文件中,默认情况下每个视图都使用此布局信息。如果您想提供一些不同的布局信息,让我们假设您的主页视图,您可以参考该布局创建一个新的“_ViewStart.cshtml”并将其放在“Home View”文件夹中。
KamalDeep answered 2019-03-21T19:00:39Z
-1 votes
我也有同样的问题,后来注意到管道中缺少app.UseStaticFiles();。
添加到管道后它正在工作。
gopalakrishnan ramasamy answered 2019-03-21T19:01:12Z