Warum hat Razor _layout.cshtml einen führenden Unterstrich im Dateinamen?

144

Im Standardprojekt ASP.NET MVC 3 beginnen Layout- und teilweise cshtml-Dateien mit einem Unterstrich

  • _viewstart
  • _Layout
  • _LogOnPartial

Warum diese Konvention und wofür wird sie verwendet? Muss ich diese Konvention befolgen?

Verleiht das Framework einer .cshtmlDatei, die mit einem Unterstrich beginnt, eine besondere Bedeutung ?

richb
quelle
Ich verwende NancyFX mit Razor und da es standardmäßig alle Inhalte einschränkt, die sich nicht im Inhaltsordner befinden. (Dies kann in web.config oder benutzerdefinierten Konfigurationen überschrieben werden.) Es ist überhaupt nicht möglich, Dateien wie .cshtml direkt bereitzustellen. Daher verwende ich nicht "_" vor meinen Ansichtsnamen, da dies NICHT notwendig und hässlich ist.
Norbert Norbertson

Antworten:

205

Razor wurde für ASP.NET-Webseiten (WebMatrix) entwickelt, die nicht den gleichen Schutz bieten, den Sie in Bezug auf Ansichtsordner und Routing in MVC erhalten. Da Layoutseiten in Webseiten nicht direkt bereitgestellt werden sollen, wird ihnen der Unterstrich vorangestellt. Das Webseiten-Framework wurde so konfiguriert, dass Dateien mit führenden Unterstrichen in ihren Namen nicht direkt angefordert werden können. Andere .cshtml-Dateien auf Webseiten müssen im Allgemeinen durchsuchbar sein. Sie entsprechen .asp- oder .php-Dateien.

Das ASP.NET-Team hat angegeben, dass Webseiten ein Ausgangspunkt für die ASP.NET-Entwicklung sind, der rechtzeitig zur Migration auf MVC führen sollte (für diejenigen, die fortfahren möchten). Ein Teil davon bedeutet, dass die Migration von Webseiten zu MVC so einfach wie möglich sein sollte. Infolgedessen ist es sinnvoll, in Webseiten festgelegte Namenskonventionen auf MVC Razor-Dateien zu übertragen.

Es gibt also einen technischen Grund, den Dateinamen einen Unterstrich voranzustellen - dies ist für MVC einfach nicht relevant.

[UPDATE Okt 2018]

Im neuen ASP.NET Core Razor Pages-Framework (außer in Version 2.1) werden Dateien mit einem führenden Unterstrich ignoriert, wenn Routen beim Start generiert werden - selbst wenn sie eine @pageDirektive haben (was sie normalerweise zu einer routbaren Razor Page macht). . Aus diesem Grund ist es sinnvoll, Layout- und Teildateien mit einem führenden Unterstrich in einer Razor Pages-Anwendung zu benennen, wenn sie nicht zum Durchsuchen vorgesehen sind.

Mike Brind
quelle
6
Vielen Dank. Für mich ist dies die aufschlussreichste Antwort. Ich hatte das Missverständnis, dass Razor an MVC gebunden war. Jetzt sehe ich den Grund für den führenden Unterstrich darin, zu verhindern, dass sie direkt unter ASP.NET-Webseiten bereitgestellt werden.
Richb
1
Ich dachte, MS würde es besser wissen, eine Namenskonvention, an die tatsächlich eine Funktionalität gebunden ist. Und jetzt wird es auf MVC übertragen, das eigentlich ein sauberer Schiefer sein sollte.
Boris B.
Hoffentlich können sie nach den aktuellen Versionen von .NET Framework 4.5.1 und Visual Studio 2013, einschließlich der "One ASP.NET" -Funktionalität, endlich von diesen technischen Einschränkungen / Hardcodierungen Abstand nehmen. Natürlich ist es wichtig, dass Standarddateien nie gemeinsam genutzt werden, wie bei den aktuellen Verzeichnissen * .config, APP_Code und APP_Data. Diese Logik sollte sich jedoch irgendwo in einer Konfigurationsdatei befinden (standardmäßig Maschinenkonfiguration), damit sie überschrieben werden kann. Auch diese Standardnamen allgemeiner Seiten sollten konfigurierbar sein (Layout / Fehler / etc ...).
Tony Wall
1
@ Daniel Oh, ich verstehe was du meinst. Ich habe die Antwort bearbeitet, da sie nicht wie angegeben funktioniert.
Mike Brind
1
@ Daniel Was Sie sehen, ist anscheinend ein Fehler, der in Razor Pages 2.1 aufgetaucht ist. Es soll in 2.2 behoben werden. Es funktioniert wie in 2.0 beschrieben.
Mike Brind
12

So macht es Ruby on Rails (Partials beginnen mit einem _, aber der Render Partial-Aufruf enthält nicht das _), und ASP.net MVC hat sich stark davon inspirieren lassen.

Eigentlich kein technischer Grund, nur eine Konvention, um anderen Entwicklern (und Ihnen 6 Monate später) klar die Absicht zu zeigen, zu sagen: Dies ist eine Teilansicht.

Michael Stum
quelle
Dies ist falsch, wie aus der obigen Antwort hervorgeht. Der Unterstrich verfügt über eine Sicherheitsfunktion.
iJungleBoy
1
@iJungleBoy Siehe die akzeptierte Antwort. Für ASP.net MVC (worum es in dieser Frage geht) gibt es keine Sicherheitsfunktionen. Weitere Informationen finden Sie in der Datei web.config im Ordner Ansichten, in der bereits alle cshtml- und aspx-Dateien blockiert sind, ob unterstrichen oder nicht ( System.Web.HttpNotFoundHandlerfür sie eingerichtet).
Michael Stum
7

Seiten, die nicht durch direkte Anforderungen Ihres Browsers angezeigt werden können (Masterseiten, Teilansichten usw.), haben am Anfang ihres Namens einen Unterstrich (_).

Wenn Sie also versuchen, die Anforderung an _Layout.cshtml (dies ist die Masterseite) zu senden, wird vom Server eine Fehlermeldung angezeigt.

Auf diese Weise können Sie die Dateien unterscheiden, die in der Razor View Engine nicht als eigenständige Seiten durchsucht werden können.

Stellen Sie sich das so vor ... in MVC 2 ... würden Sie die Teilansicht und die Mastersite mit dem Sufix .master, .ascx unterscheiden, und normale Seiten sind .aspx, in der Razor-Ansicht dagegen ... Alle Ansichten sind .cshtml. Um Teil- und Masterseiten zu unterscheiden, haben sie ein Präfix (_). Es ist nichts obligatorisch, nur eine "Konvention".

Juztin
quelle
4
Aber würden nach dieser Logik nicht ALLEN cs & cshtml-Dateien ein Unterstrich vorangestellt?
Richb
Wenn alle Dateien _ als Präfix haben würden, würde Ihre Site nicht funktionieren ... Dateien mit _prefix werden auf einer normalen Seite gerendert ... (für Partials), und der Sitemaster ist eine Vorlage ... also muss er Inhalt haben angezeigt werden.
Juztin
Also habe ich es gerade versucht und IIS auf meiner Box liefert keine Dateien aus dem Verzeichnis Ansichten. Nicht einmal statische HTML-Dateien. Ich glaube wirklich nicht, dass dies die Antwort ist.
Richb
Juztin: Die Frage ist, warum sie mit einem Unterstrich beginnen. Wenn ich _Layout.cshtm in Layout.cshtml umbenenne, funktioniert es immer noch einwandfrei. Was ist der Grund für diese Konvention?
Richb
2
Die Frage ist über asp.net mvc, nicht Webseiten
fabspro
2

Soweit ich weiß, handelt es sich lediglich um eine Konvention, mit der die Absicht der Datei ermittelt wird. Ich glaube nicht, dass dies das Verhalten der Datei tatsächlich ändern wird. In den meisten Entwicklungskontexten identifiziert das Voranstellen eines Unterstrichs etwas, das für den "privaten" Gebrauch bestimmt ist, sei es für eine Klasse oder in diesem Fall für eine andere Vorlage.

futureal
quelle
1

Ich verwende MVC nicht, aber bei Webseiten, die auch die Rasierersyntax verwenden, bedeutet das Präfix _ im Allgemeinen, dass auf die Seite nicht von einem Benutzer zugegriffen werden soll, sondern von anderen Seiten oder einem Code. Wenn Sie versuchen, zu einer Seite zu navigieren, die das _prefix enthält, verhindert asp.net den Zugriff darauf. Deshalb wird es mit Layoutseiten und anderen solchen Seiten verwendet, da ein Benutzer nicht direkt darauf zugreifen sollte.

So etwas wie der App_Code-Ordner in asp.net

Travis
quelle
@MikeBrind Sie können in keinem der Ansichten /viewin einem Standard-ASP.NET MVC-Projekt direkt zu einer der Ansichten navigieren / diese durchsuchen . Die /views/web.configDatei ist so eingerichtet, dass dies verhindert wird. Aber nichts hindert eine Controller-Aktion daran, zurückzukehren. View("_Index", model);Es funktioniert einwandfrei. Ich habe es einfach getan, indem ich den Namen einer Ansicht in _Index.cshtml geändert und die aufzurufende Aktion wie oben beschrieben geändert habe.
Andrew Barber
@MikeBrind Bei dieser Frage geht es um MVC, nicht um Webseiten. Gewährt; Das habe ich in meinem ursprünglichen Kommentar nicht angegeben.
Andrew Barber
@ MikeBrind Ich habe - und bin - auf diese Antwort geantwortet . Nicht deins. Mein erster Kommentar war irreführend (ich habe aber auch "Teilweise" erwähnt), deshalb habe ich ihn gelöscht. Mein Punkt war und ist, dass Unterstriche nichts damit zu tun haben, dass eine Ansicht nicht in MVC geladen werden kann. Dieser Benutzer sagte sogar: "Ich benutze MVC nicht", aber diese Frage betraf MVC. Ich stelle nur sicher, dass jemand, der später diese Antwort liest , nicht glaubt, dass in MVC ein Unterstrich die Fähigkeit einer Controller-Aktion zum Laden einer Ansicht beeinflusst. Keine große Sache. Wir sind uns einig, dass ich in meiner Art zu sprechen unkompliziert war. Getan.
Andrew Barber