¿Por qué Razor _layout.cshtml tiene un guión bajo destacado en el nombre del archivo?

144

En el proyecto ASP.NET MVC 3 predeterminado, el diseño y los archivos cshtml parciales comienzan con un guión bajo

  • _viewstart
  • _Layout
  • _LogOnPartial

¿Por qué esta convención y para qué sirve? ¿Necesito seguir esta convención?

¿El marco le da un significado especial a un .cshtmlarchivo que comienza con un guión bajo?

richb
fuente
Uso NancyFX con Razor y, de forma predeterminada, restringe cualquier contenido que no esté en la carpeta Contenido. (Esto puede anularse en web.config o en la configuración personalizada) es imposible servir ningún archivo como .cshtml directamente. Así que no uso "_" antepuesto a mis nombres de vista porque NO es necesario y feo.
Norbert Norbertson

Respuestas:

205

Razor fue desarrollado para páginas web ASP.NET (WebMatrix), que no tiene el mismo tipo de protección incorporada con respecto a las carpetas de vistas y enrutamiento que obtienes dentro de MVC. Dado que las páginas de diseño en las páginas web no están destinadas a ser servidas directamente, tienen el prefijo subrayado. Y el marco de páginas web se ha configurado para no permitir que los archivos con guiones bajos principales en sus nombres se soliciten directamente. Otros archivos .cshtml dentro de las páginas web generalmente necesitan ser navegables. Son el equivalente de archivos .asp o .php.

El equipo de ASP.NET ha declarado que las páginas web son un punto de partida dentro del desarrollo de ASP.NET, lo que debería conducir a la migración a MVC a tiempo (para aquellos que desean seguir adelante). Parte de eso significa que debería ser lo más fácil posible migrar de páginas web a MVC. En consecuencia, tiene sentido transferir las convenciones de nomenclatura establecidas dentro de las páginas web a los archivos MVC Razor.

Así que no es una razón técnica para prefijar los nombres de los archivos con un guión - que simplemente no es relevante para MVC.

[ACTUALIZACIÓN Oct 2018]

En el nuevo marco de ASP.NET Core Razor Pages (aparte de en la versión 2.1), los archivos con un guión bajo se ignoran cuando se generan rutas al inicio, incluso si tienen una @pagedirectiva (que normalmente las convertiría en una página Razor enrutable) . Es por eso que tiene sentido nombrar el diseño y los archivos parciales con un guión bajo destacado en una aplicación Razor Pages si no están destinados a ser explorados.

Mike Brind
fuente
66
Gracias. Para mí esta es la respuesta más perspicaz. Estaba bajo el malentendido de que Razor estaba vinculado a MVC. Ahora veo que la razón del guión bajo principal es evitar que se publiquen directamente en las páginas web ASP.NET.
richb
1
Una convención de nomenclatura que en realidad tiene una funcionalidad vinculada, pensé que MS lo sabría mejor. Y ahora se transfiere a MVC, que se suponía que era una pizarra limpia.
Boris B.
Con suerte, después de las versiones actuales de .NET Framework 4.5.1 y Visual Studio 2013, incluida la funcionalidad "One ASP.NET", finalmente pueden alejarse de estas limitaciones técnicas / codificación rígida. Por supuesto, tener archivos estándar nunca compartidos es esencial como con los directorios actuales * .config, APP_Code y APP_Data. Pero esta lógica debería ubicarse en un archivo de configuración en alguna parte (configuración de la máquina como predeterminada) para que pueda ser anulada. Además, estos nombres predeterminados de páginas comunes deben ser configurables (Diseño / Error / etc ...).
Tony Wall
1
@Daniel Oh, entiendo lo que quieres decir. He editado la respuesta porque no funciona como se anuncia.
Mike Brind
1
@Daniel Lo que estás viendo es aparentemente un error que apareció en Razor Pages 2.1. Está programado para ser reparado en 2.2. Funciona como lo describí en 2.0.
Mike Brind
12

Así es como lo hace Ruby on Rails (los parciales comienzan con un _ pero la llamada Render parcial no incluye el _), y ASP.net MVC se ha inspirado mucho en él.

Realmente no hay una razón técnica, solo una convención para mostrar claramente la intención a otros desarrolladores (y a ti mismo 6 meses después) de decir: Esta es una vista parcial.

Michael Stum
fuente
esto es incorrecto, como lo señala la respuesta anterior: el subrayado tiene una funcionalidad de seguridad.
iJungleBoy
1
@iJungleBoy Ver la respuesta aceptada. para ASP.net MVC (sobre el que trata esta pregunta), no hay funcionalidad de seguridad. Consulte web.config en la carpeta Vistas que ya bloquea todos los archivos cshtml y aspx, subrayados o no (configurados System.Web.HttpNotFoundHandlerpara ellos).
Michael Stum
7

Las páginas que no pueden mostrarse mediante solicitudes directas de su navegador (páginas maestras, vistas parciales, etc.) tienen un guión bajo (_) al comienzo de sus nombres.

Entonces, si intenta hacer la solicitud a _Layout.cshtml (esta es la página maestra), recibirá un error del servidor.

Es una forma de distinguir los archivos que no se pueden examinar como páginas independientes, en el motor de visualización Razor.

Piénselo de esta manera ... en MVC 2 ... diferenciaría la vista parcial y el sitio maestro con el sufijo .master, .ascx, y las páginas normales son .aspx, por otro lado, en la vista Razor ... todas las vistas son .cshtml, por lo que para distinguir páginas parciales y maestras tendrán un prefijo (_). no es nada obligatorio, solo una "convención".

Juztin
fuente
44
Pero según esa lógica, ¿NO TODOS los archivos cs y cshtml se prefijarán con un guión bajo?
richb
si todos los archivos tendrían _ como prefijo, entonces su sitio no funcionaría ... los archivos que tienen _prefijo se representan dentro de una página normal ... (para parciales), y el administrador del sitio es una plantilla ... por lo que debe tener contenido para se mostrará.
Juztin
Así que acabo de probar esto, e IIS en mi caja no sirve ningún archivo desde el directorio Vistas. Ni siquiera los archivos .html estáticos. Así que realmente no creo que esta sea la respuesta.
richb
Juztin: La pregunta es ¿por qué comienzan con un guión bajo? Si cambio el nombre de _Layout.cshtm a Layout.cshtml, todavía funciona bien. Entonces, ¿cuál es la razón de esta convención?
richb
2
La pregunta es sobre asp.net mvc, no sobre páginas web
fabspro
2

Hasta donde sé, esto es simplemente una convención utilizada para identificar la intención del archivo; No creo que realmente cambie el comportamiento del archivo. En la mayoría de los contextos de desarrollo, anteponer un guión bajo identifica algo destinado a uso "privado", ya sea por una clase o, en este caso, por otra plantilla.

futuro
fuente
1

No uso MVC, pero con las páginas web que también usan la sintaxis de la maquinilla de afeitar, el prefijo _ generalmente indica que la página no está destinada a que un usuario acceda a ella, sino a otras páginas o algún código. Si intenta navegar a una página que contiene el _prefix, asp.net evitará el acceso a él. Es por eso que se usa con páginas de diseño y otras páginas similares, ya que un usuario no debe acceder a ellas directamente.

Algo así como la carpeta App_Code en asp.net

Travis
fuente
@MikeBrind No puede 'navegar' a / explorar directamente ninguna de las vistas /viewen un proyecto MVC ASP.NET predeterminado; el /views/web.configarchivo está configurado para evitarlo. Pero no hay nada que impida que regrese una acción del controlador. View("_Index", model);Funciona bien; Simplemente lo hice cambiando el nombre de una vista a _Index.cshtml y cambiando la acción para llamar como lo hice anteriormente.
Andrew Barber
@MikeBrind Esta pregunta es sobre MVC, no sobre páginas web. Concedido; No especifiqué eso en mi comentario original.
Andrew Barber
@MikeBrind Estaba - y estoy - respondiendo a esta respuesta. No es tuyo. Mi comentario inicial fue engañoso (aunque también mencioné "parciales"), así que lo he eliminado. Mi punto era y es que los guiones bajos no tienen nada que ver con no poder cargar una vista en MVC. Este usuario incluso comenzó a decir: "No uso MVC", pero esta pregunta era sobre MVC. Solo me estoy asegurando de que alguien venga más tarde leyendo esta respuesta de alguna manera no piense que en MVC, un guión bajo afecta la capacidad de una acción del controlador para cargar una vista. No es gran cosa. Estamos de acuerdo en que fui ingenioso en mi forma de hablar. Hecho.
Andrew Barber