Perché Razor _layout.cshtml ha un carattere di sottolineatura iniziale nel nome del file?


144

Nel progetto ASP.NET MVC 3 predefinito, il layout e i file cshtml parziali iniziano con un carattere di sottolineatura

  • _viewstart
  • _Layout
  • _LogOnPartial

Perché questa convenzione e a cosa serve? Devo seguire questa convenzione?

Il framework dà un significato speciale a un .cshtmlfile che inizia con un trattino basso?


Uso NancyFX con Razor e poiché, per impostazione predefinita, limita qualsiasi contenuto non presente nella cartella Contenuto. (Questo può essere sovrascritto in web.config o nella configurazione personalizzata) è impossibile servire direttamente qualsiasi file come .cshtml. Quindi non uso "_" anteposto ai nomi delle mie visualizzazioni perché NON è necessario e brutto.
Norbert Norbertson,

Risposte:


205

Razor è stato sviluppato per le pagine Web ASP.NET (WebMatrix), che non ha lo stesso tipo di protezione integrato per quanto riguarda le cartelle e il routing di Views ottenute all'interno di MVC. Poiché le pagine di layout nelle pagine Web non sono destinate alla pubblicazione diretta, hanno come prefisso il carattere di sottolineatura. E il framework delle pagine Web è stato configurato per non consentire la richiesta diretta di file con caratteri di sottolineatura principali nei loro nomi. Altri file .cshtml all'interno delle pagine Web devono generalmente essere sfogliabili. Sono l'equivalente dei file .asp o .php.

Il team ASP.NET ha dichiarato che le pagine Web sono un punto di partenza nello sviluppo di ASP.NET, il che dovrebbe portare alla migrazione in tempo per MVC (per coloro che vogliono andare avanti). Parte di ciò significa che dovrebbe essere il più semplice possibile migrare da pagine Web a MVC. Di conseguenza, ha senso trasferire le convenzioni di denominazione stabilite nelle pagine Web sui file MVC Razor.

Quindi non v'è una ragione tecnica per precedere i nomi dei file con un carattere di sottolineatura - semplicemente non è rilevante per MVC.

[AGGIORNAMENTO ottobre 2018]

Nel nuovo framework ASP.NET Core Razor Pages (a parte nella versione 2.1), i file con un trattino basso vengono ignorati quando vengono generate rotte all'avvio - anche se hanno una @pagedirettiva (che normalmente li renderebbe una Pagina Razor instradabile) . Ecco perché ha senso nominare layout e file parziali con un carattere di sottolineatura iniziale in un'applicazione Razor Pages se non sono previsti per essere sfogliati.


6
Grazie. Per me questa è la risposta più perspicace. Ero sotto l'errata comprensione che Razor fosse legato a MVC. Ora vedo il motivo del carattere di sottolineatura principale è impedire che vengano offerti direttamente nelle pagine Web ASP.NET.
richb

1
Una convenzione di denominazione che in realtà ha una funzionalità legata, pensavo che MS avrebbe saputo meglio. E ora viene trasferito a MVC, che doveva essere una tabula rasa.
Boris B.,

Si spera che dopo le attuali versioni di .NET Framework 4.5.1 e Visual Studio 2013, inclusa la funzionalità "One ASP.NET", possano finalmente abbandonare queste limitazioni tecniche / hard-coding. Naturalmente avere file standard mai condivisi è essenziale come con le attuali directory * .config, APP_Code e APP_Data. Ma questa logica dovrebbe trovarsi in un file di configurazione da qualche parte (configurazione della macchina come predefinita) in modo che possa essere sovrascritta. Anche questi nomi predefiniti di pagine comuni dovrebbero essere configurabili (Layout / Errore / ecc ...).
Tony Wall,

1
@Daniel Oh, capisco cosa intendi. Ho modificato la risposta perché non funziona come pubblicizzato.
Mike Brind,

1
@Daniel Quello che stai vedendo è apparentemente un bug emerso in Razor Pages 2.1. È programmato per essere risolto in 2.2. Funziona come ho descritto in 2.0.
Mike Brind,

12

È così che Ruby on Rails lo fa (i Partial iniziano con un _ ma la chiamata Render Partial non include il _), e ASP.net MVC ne ha tratto grande ispirazione.

Nessun motivo tecnico in realtà, solo una convenzione per mostrare chiaramente l'intenzione di altri sviluppatori (e te stesso 6 mesi dopo) di dire: questa è una visione parziale.


questo non è corretto, come sottolineato dalla risposta sopra - il carattere di sottolineatura ha una funzionalità di sicurezza.
iJungleBoy,

1
@iJungleBoy Vedi la risposta accettata. per ASP.net MVC (di cui si tratta questa domanda), non esiste alcuna funzionalità di sicurezza. Vedi web.config nella cartella Views che blocca già tutti i file cshtml e aspx, sottolineatura o meno (configurati System.Web.HttpNotFoundHandlerper loro).
Michael Stum

7

Le pagine che non possono essere mostrate da richieste dirette dal tuo browser (pagine mastro, viste parziali ecc.) Hanno il trattino basso (_) all'inizio del loro nome.

Quindi, se provi a inviare la richiesta a _Layout.cshtml (questa è la pagina principale) riceverai un errore dal server.

È un modo per distinguere i file che non possono essere sfogliati come pagine autonome, nel motore di visualizzazione Razor.

Pensala in questo modo ... in MVC 2 ... dovresti differenziare la vista parziale e il sito master con il suffisso .master, .ascx e le pagine normali sono .aspx, d'altra parte, nella vista Rasoio ... tutte le viste sono .cshtml, quindi per distinguere le pagine parziali e quelle principali avranno un prefisso (_). non è niente di obbligatorio, solo una "convenzione".


4
Ma secondo quella logica TUTTI i file cs & cshtml non avrebbero il prefisso?
richb

se tutti i file avessero _ come prefisso, allora il tuo sito non funzionerebbe ... i file che hanno _prefix sono renderizzati all'interno di una pagina normale ... (per i parziali), e il sitemaster è un modello ... quindi deve avere contenuto per essere visualizzato.
Juztin,

Quindi ho appena provato questo e IIS sulla mia scatola non serve alcun file dalla directory Views. Neanche file .html statici. Quindi non penso proprio che questa sia la risposta.
richb

Juztin: La domanda è: perché iniziano con un trattino basso? Se rinomino _Layout.cshtm in Layout.cshtml funziona ancora bene. Allora, qual è la ragione di questa convenzione?
richb

2
La domanda riguarda asp.net mvc, non le pagine web
fabspro,

2

Per quanto ne so, si tratta semplicemente di una convenzione utilizzata per identificare l'intento del file; Non credo che cambierà effettivamente il comportamento del file. Nella maggior parte dei contesti di sviluppo, antepone un carattere di sottolineatura identifica qualcosa che deve essere inteso per un uso "privato", sia da una classe, o in questo caso, da un altro modello.


1

Non uso MVC, ma con le pagine Web che usano anche la sintassi del rasoio, il prefisso _ generalmente indica che la pagina non è pensata per essere accessibile da un utente ma da altre pagine o da qualche codice. Se si tenta di accedere a una pagina che contiene _prefix, asp.net impedisce di accedervi. Ecco perché viene utilizzato con le pagine di layout e altre pagine simili poiché non devono essere accessibili direttamente da un utente.

Qualcosa come la cartella App_Code in asp.net


@MikeBrind Non puoi 'navigare' verso / sfogliare direttamente nessuna delle viste /viewin un progetto MVC ASP.NET predefinito; il /views/web.configfile è impostato per impedirlo. Ma non c'è nulla che impedisca il ritorno di un'azione del controller View("_Index", model);Funziona bene; L'ho fatto semplicemente cambiando il nome di una vista in _Index.cshtml e cambiando l'azione da chiamare come ho fatto sopra.
Andrew Barber,

@MikeBrind Questa domanda riguarda MVC, non le pagine Web. Certo; Non l'ho specificato nel mio commento originale.
Andrew Barber,

@MikeBrind Stavo - e sto - rispondendo a questa risposta. Non tuo. Il mio commento iniziale era fuorviante (ho anche menzionato "parziali", quindi), quindi l'ho eliminato. Il mio punto era ed è che i trattini bassi non hanno nulla a che fare con il fatto di non poter caricare una vista in MVC. Questo utente ha persino iniziato a dire "Non uso MVC", ma questa domanda riguardava MVC. Sto solo assicurandomi che qualcuno venga dopo a leggere questa risposta non pensi in qualche modo che in MVC, un carattere di sottolineatura influisca sulla capacità di un'azione del controller di caricare una vista. Nessun grosso problema. Siamo d'accordo che ero inartful nel modo in cui ho parlato. Fatto.
Andrew Barber,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.