Pourquoi Razor _layout.cshtml a-t-il un trait de soulignement principal dans le nom de fichier?

144

Dans le projet ASP.NET MVC 3 par défaut, les fichiers de mise en page et partiels cshtml commencent par un trait de soulignement

  • _viewstart
  • _Layout
  • _LogOnPartial

Pourquoi cette convention et à quoi sert-elle? Dois-je suivre cette convention?

Le framework donne-t-il une signification particulière à un .cshtmlfichier qui commence par un trait de soulignement?

richb
la source
J'utilise NancyFX avec Razor et puisque, par défaut, il restreint tout contenu qui ne se trouve pas dans le dossier Content. (Cela peut être remplacé dans web.config ou dans la configuration personnalisée), il est impossible de servir des fichiers tels que .cshtml directement. Donc je n'utilise pas "_" en préfixe à mes noms de vues car ce n'est PAS nécessaire et moche.
Norbert Norbertson

Réponses:

205

Razor a été développé pour les pages Web ASP.NET (WebMatrix), qui n'ont pas le même type de protection intégrée concernant les dossiers Views et le routage que vous obtenez dans MVC. Étant donné que les pages de mise en page des pages Web ne sont pas destinées à être servies directement, elles sont précédées du trait de soulignement. Et le cadre de pages Web a été configuré pour ne pas autoriser les fichiers avec des traits de soulignement dans leur nom d'être demandés directement. Les autres fichiers .cshtml des pages Web doivent généralement être consultables. Ils sont l'équivalent des fichiers .asp ou .php.

L'équipe ASP.NET a déclaré que les pages Web sont un point de départ dans le développement ASP.NET, ce qui devrait conduire à la migration vers MVC à temps (pour ceux qui veulent passer à autre chose). Cela signifie en partie qu'il devrait être aussi simple que possible de migrer des pages Web vers MVC. Par conséquent, il est judicieux de transférer les conventions de dénomination établies dans les pages Web vers des fichiers MVC Razor.

Il y a donc une raison technique de préfixer les noms de fichiers avec un trait de soulignement - cela n'est tout simplement pas pertinent pour MVC.

[MISE À JOUR octobre 2018]

Dans le nouveau framework ASP.NET Core Razor Pages (sauf dans la version 2.1), les fichiers avec un trait de soulignement en tête sont ignorés lorsque les routes sont générées au démarrage - même s'ils ont une @pagedirective (ce qui en ferait normalement une page Razor routable) . C'est pourquoi il est judicieux de nommer la mise en page et les fichiers partiels avec un trait de soulignement en tête dans une application Razor Pages s'ils ne sont pas destinés à être parcourus.

Mike Brind
la source
6
Merci. Pour moi, c'est la réponse la plus perspicace. J'avais l'impression erronée que Razor était lié à MVC. Maintenant, je vois que la raison du trait de soulignement principal est de les empêcher d'être servis directement sous les pages Web ASP.NET.
richb
1
Une convention de dénomination qui a en fait une fonctionnalité liée, je pensais que MS saurait mieux. Et maintenant, il est transféré à MVC, qui était censé être une table rase.
Boris B.
Espérons qu'après les versions actuelles de .NET Framework 4.5.1 et Visual Studio 2013, y compris la fonctionnalité «One ASP.NET», ils pourront enfin s'éloigner de ces limitations techniques / codage en dur. Bien sûr, il est essentiel de ne jamais partager les fichiers standard, comme avec les répertoires actuels * .config, APP_Code et APP_Data. Mais cette logique doit se trouver quelque part dans un fichier de configuration (configuration de la machine par défaut) afin qu'elle puisse être remplacée. De plus, ces noms par défaut des pages communes doivent être configurables (Layout / Error / etc ...).
Tony Wall
1
@Daniel Oh, je vois ce que tu veux dire. J'ai modifié la réponse car elle ne fonctionne pas comme annoncé.
Mike Brind
1
@Daniel Ce que vous voyez est apparemment un bogue qui est apparu dans Razor Pages 2.1. Il est prévu de le corriger dans la version 2.2. Cela fonctionne comme je l'ai décrit dans 2.0.
Mike Brind
12

C'est ainsi que Ruby on Rails le fait (les partiels commencent par un _ mais l'appel Render Partial n'inclut pas le _), et ASP.net MVC s'en est fortement inspiré.

Aucune raison technique vraiment, juste une convention pour montrer clairement l'intention aux autres développeurs (et à vous-même 6 mois plus tard) de dire: Ceci est une vue partielle.

Michael Stum
la source
c'est incorrect, comme indiqué par la réponse ci-dessus - le soulignement a une fonctionnalité de sécurité.
iJungleBoy
1
@iJungleBoy Voir la réponse acceptée. pour ASP.net MVC (sur lequel porte cette question), il n'y a pas de fonctionnalité de sécurité. Voir le web.config dans le dossier Views qui bloque déjà tous les fichiers cshtml et aspx, soulignés ou non (mis en place System.Web.HttpNotFoundHandlerpour eux).
Michael Stum
7

Les pages qui ne peuvent pas être affichées par des requêtes directes de votre navigateur (pages maîtres, vues partielles, etc.) ont un trait de soulignement (_) au début de leur nom.

Donc, si vous essayez de faire la demande à _Layout.cshtml (c'est la page maître), vous obtiendrez une erreur du serveur.

C'est une façon de distinguer les fichiers qui ne peuvent pas être parcourus en tant que pages autonomes, dans le moteur de visualisation Razor.

Pensez-y de cette façon ... dans MVC 2 ... vous différencieriez la vue partielle et le site maître avec le suffixe .master, .ascx, et les pages normales sont .aspx, par contre, en vue Razor ... toutes les vues sont .cshtml, donc pour distinguer les pages partielles et maîtres, elles auront un préfixe (_). ce n'est rien d'obligatoire, juste une "convention".

Juztin
la source
4
Mais selon cette logique, TOUS les fichiers cs et cshtml ne seraient-ils pas préfixés par un trait de soulignement?
richb
si tous les fichiers avaient _ comme préfixe, alors votre site ne fonctionnerait pas ... les fichiers qui ont _prefix sont rendus dans une page normale ... (pour les partiels), et le sitemaster est un modèle ... il doit donc avoir du contenu pour être affichée.
Juztin
Donc j'ai juste essayé ceci, et IIS sur ma boîte ne sert aucun fichier du répertoire Views,. Pas même les fichiers .html statiques. Donc, je ne pense vraiment pas que ce soit la réponse.
richb
Juztin: La question est de savoir pourquoi commencent-ils par un trait de soulignement? Si je renomme _Layout.cshtm en Layout.cshtml, cela fonctionne toujours très bien. Alors, quelle est la raison de cette convention?
richb
2
La question concerne asp.net mvc, pas les pages Web
fabspro
2

Autant que je sache, il s'agit simplement d'une convention utilisée pour identifier l'intention du dossier; Je ne pense pas que cela changera réellement le comportement du fichier. Dans la plupart des contextes de développement, le préfixe d'un trait de soulignement identifie quelque chose qui doit être destiné à un usage "privé", que ce soit par une classe, ou dans ce cas, un autre modèle.

futuriste
la source
1

Je n'utilise pas MVC, mais avec des pages Web qui utilisent également la syntaxe de rasoir, le préfixe _ signifie généralement que la page n'est pas destinée à être accédée par un utilisateur mais par d'autres pages ou du code. Si vous essayez d'accéder à une page contenant le préfixe _, asp.net en empêcherait l'accès. C'est pourquoi il est utilisé avec des pages de mise en page et d'autres pages similaires, car ils ne doivent pas être accédés directement par un utilisateur.

Quelque chose comme le dossier App_Code dans asp.net

Travis
la source
@MikeBrind Vous ne pouvez pas «naviguer» vers / parcourir directement l' une des vues ci-dessous /viewdans un projet ASP.NET MVC par défaut; le /views/web.configfichier est configuré pour l'empêcher. Mais rien n'empêche une action de contrôleur de revenir. View("_Index", model);Cela fonctionne très bien; Je l'ai juste fait en changeant le nom d'une vue en _Index.cshtml et en changeant l'action pour appeler comme je l'ai fait ci-dessus.
Andrew Barber
@MikeBrind Cette question concerne MVC, pas les pages Web. Accordé; Je n'ai pas précisé cela dans mon commentaire initial.
Andrew Barber
@MikeBrind J'étais - et je suis - en train de répondre à cette réponse. Pas le vôtre. Mon commentaire initial était trompeur (j'ai également mentionné "partiels", cependant), donc je l'ai supprimé. Mon point était et est que les traits de soulignement n'ont rien à voir avec l'impossibilité de charger une vue dans MVC. Cet utilisateur a même commencé à dire: "Je n'utilise pas MVC", mais cette question concernait MVC. Je m'assure simplement que quelqu'un qui lira plus tard cette réponse ne pense pas que dans MVC, un trait de soulignement affecte la capacité d'une action de contrôleur à charger une vue. Pas grand-chose. Nous convenons que je n'ai pas été intelligent dans ma façon de parler. Terminé.
Andrew Barber