Answers:
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应用程序中使用前导下划线命名布局和部分文件的原因(如果不打算浏览它们的话)。
这就是Ruby on Rails的工作方式(部分以_开头,但Render Partial调用不包含_),并且ASP.net MVC从中得到了很多启发。
确实没有技术上的原因,只是一个约定,可以清楚地向其他开发人员(和您自己六个月后)说:
System.Web.HttpNotFoundHandler
为其设置)。
无法从浏览器直接请求显示的页面(母版页,部分视图等)的名称开头应带有下划线(_)。
因此,如果您尝试向_Layout.cshtml(这是母版页)发出请求,则会从服务器收到错误消息。
它是在Razor视图引擎中区分无法作为独立页面浏览的文件的一种方式。
这样想吧...在MVC 2中...您将使用sufix .master,.ascx和常规页面是.aspx来区分部分视图和主站点,而在Razor视图中...所有视图都是.cshtml,因此为了区分部分页面和母版页,它们将带有前缀(_)。它没有强制性,只是一个“约定”。
我不使用MVC,但是对于也使用razor语法的网页,_前缀通常可以简化该页面的访问范围,而不是供用户访问,而是由其他页面或某些代码访问。如果您尝试导航到包含_prefix的页面,则asp.net将阻止对其的访问。这就是为什么它与布局页面和其他此类页面一起使用的原因,因为用户不应直接访问它们。
类似于asp.net中的App_Code文件夹
/view
;该/views/web.config
文件被设置为防止它。但是没有什么可以阻止控制器动作返回的View("_Index", model);
。我只是通过将视图的名称更改为_Index.cshtml并像上面一样将操作更改为call来完成此操作。