为什么Razor _layout.cshtml的文件名中带有下划线?


144

在默认的ASP.NET MVC 3项目中,布局和部分cshtml文件以下划线开头

  • _viewstart
  • _Layout
  • _LogOnPartial

为什么要使用此约定,这有什么用?我需要遵守这个约定吗?

框架是否对.cshtml以下划线开头的文件赋予特殊含义?


我将NancyFX与Razor一起使用,因为默认情况下它会限制Content文件夹中没有的任何内容。(可以在web.config或自定义配置中覆盖),根本无法直接提供任何文件,例如.cshtml。因此,我不必在视图名称前使用“ _”,因为它既不必要又丑陋。
诺伯特Norbertson

Answers:


205

Razor是为ASP.NET Web Pages(WebMatrix)开发的,它与在MVC中获得的关于Views文件夹和Routing的内置保护不同。由于网页中的布局页面不旨在直接提供,因此必须在其下标下划线。而且,Web页面框架已配置为不允许直接请求名称中带有下划线的文件。网页中的其他.cshtml文件通常需要可浏览。它们等效于.asp或.php文件。

ASP.NET团队表示,Web页面是ASP.NET开发中的起点,这应该导致及时迁移到MVC(对于那些想要继续前进的人)。这部分意味着从网页迁移到MVC应该尽可能容易。因此,将Web页中建立的命名约定继承到MVC Razor文件是有意义的。

因此,在文件名前加上下划线有技术原因的-它与MVC无关。

[2018年10月更新]

在新的ASP.NET Core Razor Pages框架(版本2.1中除外)中,在启动时生成路由时会忽略带有下划线的文件-即使它们具有@page指令(通常会使它们成为可路由的Razor Page) 。这就是为什么在Razor Pages应用程序中使用前导下划线命名布局和部分文件的原因(如果不打算浏览它们的话)。


6
谢谢。对我来说,这是最有见地的答案。我很担心Razor与MVC有联系。现在,我知道使用下划线的原因是防止它们直接在ASP.NET网页下提供。
richb 2011年

1
我认为,实际上有功能绑定的命名约定,MS会更好。现在,它被转移到了MVC,这本来应该是干净的。
鲍里斯·B

希望在当前的.NET Framework 4.5.1和Visual Studio 2013版本包括“一个ASP.NET”功能之后,他们最终可以摆脱这些技术限制/硬编码。当然,与当前* .config,APP_Code和APP_Data目录一样,永不共享标准文件是至关重要的。但是,此逻辑应该放在某个配置文件中(默认为计算机配置),以便可以覆盖它。这些通用页面的默认名称也应该是可配置的(布局/错误/等)。
Tony Wall

1
@丹尼尔哦,我明白你的意思了。我已经编辑了答案,因为它不能像宣传的那样工作。
Mike Brind

1
@Daniel您所看到的显然是Razor Pages 2.1中出现的一个错误。它计划在2.2中修复。它按照我在2.0中描述的那样工作。
Mike Brind

12

这就是Ruby on Rails的工作方式(部分以_开头,但Render Partial调用不包含_),并且ASP.net MVC从中得到了很多启发。

确实没有技术上的原因,只是一个约定,可以清楚地向其他开发人员(和您自己六个月后)说:


正如上面答案所指出的,这是不正确的-下划线具有安全功能。
iJungleBoy

1
@iJungleBoy查看已接受的答案。对于ASP.net MVC(此问题有关),没有安全功能。请参阅Views文件夹中的web.config,该文件夹已阻止所有cshtml和aspx文件(是否带有下划线)(System.Web.HttpNotFoundHandler为其设置)。
Michael Stum

7

无法从浏览器直接请求显示的页面(母版页,部分视图等)的名称开头应带有下划线(_)。

因此,如果您尝试向_Layout.cshtml(这是母版页)发出请求,则会从服务器收到错误消息。

它是在Razor视图引擎中区分无法作为独立页面浏览的文件的一种方式。

这样想吧...在MVC 2中...您将使用sufix .master,.ascx和常规页面是.aspx来区分部分视图和主站点,而在Razor视图中...所有视图都是.cshtml,因此为了区分部分页面和母版页,它们将带有前缀(_)。它没有强制性,只是一个“约定”。


4
但是通过这种逻辑,不是所有的cs和cshtml文件都带有下划线前缀吗?
2011年

如果所有文件都以_作为前缀,则您的网站将无法正常工作。具有_prefix的文件将在常规页面内呈现(用于局部显示),并且网站站长是模板...因此它必须包含以下内容:被显示。
Juztin

因此,我只是尝试了此操作,并且我的包装盒上的IIS不提供Views目录中的任何文件。甚至不是静态的.html文件。所以我真的不认为这是答案。
richb 2011年

Juztin:问题是为什么它们要以下划线开头?如果我将_Layout.cshtm重命名为Layout.cshtml,它仍然可以正常工作。那么,这样做的原因是什么呢?
richb 2011年

2
问题是关于asp.net mvc,而不是网页
fabspro 2012年

2

据我所知,这只是用来识别文件意图的约定;我认为它实际上不会改变文件的行为。在大多数开发环境中,在下划线前加一字,意味着可以“私有”使用的内容,无论是通过类,还是在本例中为其他模板。


1

我不使用MVC,但是对于也使用razor语法的网页,_前缀通常可以简化该页面的访问范围,而不是供用户访问,而是由其他页面或某些代码访问。如果您尝试导航到包含_prefix的页面,则asp.net将阻止对其的访问。这就是为什么它与布局页面和其他此类页面一起使用的原因,因为用户不应直接访问它们。

类似于asp.net中的App_Code文件夹


@MikeBrind您不能直接导航/浏览默认ASP.NET MVC项目中的任何视图/view;该/views/web.config文件被设置为防止它。但是没有什么可以阻止控制器动作返回的View("_Index", model);。我只是通过将视图的名称更改为_Index.cshtml并像上面一样将操作更改为call来完成此操作。
Andrew Barber

@MikeBrind这个问题是关于MVC,而不是网页。授予;我没有在原始评论中指出这一点。
安德鲁·巴伯

@MikeBrind我曾经(也是现在)在回答这个答案。不是你的。我的最初评论有误导性(尽管我也提到了“部分”),所以我删除了它。我的观点是,下划线与无法在MVC中加载视图无关。该用户甚至开始说“我不使用MVC”,但是这个问题与MVC有关。我只是确保稍后阅读答案的人不会以某种方式认为在MVC中,下划线会影响控制器动作加载视图的能力。没什么大不了的。我们同意我的言语是虚假的。做完了
Andrew Barber 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.