Dlaczego Razor _layout.cshtml ma wiodące podkreślenie w nazwie pliku?

144

W domyślnym projekcie ASP.NET MVC 3 układ i częściowe pliki cshtml zaczynają się od podkreślenia

  • _viewstart
  • _Layout
  • _LogOnPartial

Po co ta konwencja i do czego służy? Czy muszę przestrzegać tej konwencji?

Czy struktura nadaje specjalne znaczenie .cshtmlplikowi, który zaczyna się od podkreślenia?

Richb
źródło
Używam NancyFX z Razor i ponieważ domyślnie ogranicza zawartość, której nie ma w folderze Content. (Można to zmienić w pliku web.config lub w konfiguracji niestandardowej) nie jest możliwe bezpośrednie obsługiwanie żadnych plików, takich jak .cshtml. Dlatego nie używam „_” przed nazwami moich widoków, ponieważ NIE jest to konieczne i brzydkie.
Norbert Norbertson

Odpowiedzi:

205

Razor został opracowany dla stron sieci Web ASP.NET (WebMatrix), które nie mają tego samego rodzaju ochrony wbudowanej w odniesieniu do folderów widoków i routingu, które można uzyskać w MVC. Ponieważ strony układu stron internetowych nie są przeznaczone do bezpośredniego wyświetlania, są one poprzedzone podkreśleniem. Struktura stron internetowych została skonfigurowana tak, aby nie zezwalać na bezpośrednie żądanie plików z wiodącymi podkreśleniami w nazwie. Inne pliki .cshtml na stronach internetowych zazwyczaj wymagają możliwości przeglądania. Są odpowiednikami plików .asp lub .php.

Zespół ASP.NET stwierdził, że strony internetowe są punktem wyjścia w rozwoju ASP.NET, co powinno doprowadzić do migracji na MVC w czasie (dla tych, którzy chcą przejść dalej). Po części oznacza to, że migracja ze stron internetowych do MVC powinna być jak najłatwiejsza. W związku z tym sensowne jest przenoszenie konwencji nazewnictwa ustanowionych na stronach sieci Web do plików MVC Razor.

Więc nie jest to powód techniczny poprzedzenie nazwy plików ze znakiem podkreślenia - po prostu nie ma znaczenia dla MVC.

[UPDATE paź 2018]

W nowej platformie ASP.NET Core Razor Pages (poza wersją 2.1) pliki z początkowym podkreśleniem są ignorowane, gdy trasy są generowane podczas uruchamiania - nawet jeśli mają @pagedyrektywę (która normalnie uczyniłaby je stroną Razor z trasowaniem) . Dlatego sensowne jest nazywanie układu i częściowych plików z wiodącym podkreśleniem w aplikacji Razor Pages, jeśli nie są one przeznaczone do przeglądania.

Mike Brind
źródło
6
Dzięki. Dla mnie to najbardziej wnikliwa odpowiedź. Miałem błędne przekonanie, że Razor jest powiązany z MVC. Teraz widzę, że głównym podkreśleniem jest uniemożliwienie wyświetlania ich bezpośrednio na stronach sieci Web ASP.NET.
richb,
1
Konwencja nazewnictwa, która faktycznie ma powiązaną funkcjonalność, pomyślałem, że MS będzie wiedział lepiej. A teraz jest przenoszony do MVC, który miał być czystym kontem.
Boris B.
Miejmy nadzieję, że po obecnych wydaniach .NET Framework 4.5.1 i Visual Studio 2013, w tym funkcji „One ASP.NET”, będą mogli wreszcie odejść od tych ograniczeń technicznych / sztywnego kodowania. Oczywiście posiadanie standardowych plików, które nigdy nie są udostępniane, jest niezbędne, tak jak w przypadku obecnych katalogów * .config, APP_Code i APP_Data. Ale ta logika powinna znajdować się gdzieś w pliku konfiguracyjnym (domyślnie konfiguracja maszyny), aby można ją było zastąpić. Również te domyślne nazwy wspólnych stron powinny być konfigurowalne (Layout / Error / etc ...).
Tony Wall
1
@Daniel Och, rozumiem, co masz na myśli. Zmieniłem odpowiedź, ponieważ nie działa zgodnie z reklamą.
Mike Brind
1
@Daniel To, co widzisz, jest najwyraźniej błędem, który pojawił się w Razor Pages 2.1. Ma to zostać naprawione w 2.2. Działa tak, jak opisałem w 2.0.
Mike Brind
12

W ten sposób robi to Ruby on Rails (fragmenty zaczynają się od _, ale wywołanie Render Partial nie zawiera _), a ASP.net MVC czerpał z niego wiele inspiracji.

Żadnego technicznego powodu, tak naprawdę, tylko konwencja, aby jasno pokazać innym programistom (i sobie 6 miesięcy później) zamiar powiedzenia: To jest częściowy pogląd.

Michael Stum
źródło
jest to niepoprawne, jak wskazuje powyższa odpowiedź - podkreślenie ma funkcję bezpieczeństwa.
iJungleBoy,
1
@iJungleBoy Zobacz zaakceptowaną odpowiedź. w przypadku ASP.net MVC (którego dotyczy to pytanie) nie ma funkcji zabezpieczeń. Zobacz plik web.config w folderze Views, który już blokuje wszystkie pliki cshtml i aspx, podkreślając lub nie (konfiguruje System.Web.HttpNotFoundHandlerje).
Michael Stum
7

Strony, których nie można wyświetlić za pomocą bezpośrednich żądań z przeglądarki (strony wzorcowe, częściowe wyświetlenia itp.) Mają na początku nazwy podkreślenie (_).

Więc jeśli spróbujesz wysłać żądanie do _Layout.cshtml (to jest strona główna), otrzymasz błąd z serwera.

Jest to sposób na rozróżnienie plików, których nie można przeglądać jako samodzielnych stron w silniku widoku Razor.

Pomyśl o tym w ten sposób ... w MVC 2 ... możesz rozróżnić widok częściowy i witrynę główną z sufiksem .master, .ascx, a zwykłe strony to .aspx, z drugiej strony w widoku Razor ... wszystkie widoki są w formacie .cshtml, więc w celu rozróżnienia stron częściowych i stron głównych będą one miały przedrostek (_). to nic obowiązkowego, po prostu „konwencja”.

Juztin
źródło
4
Ale zgodnie z tą logiką, czy WSZYSTKIE pliki cs i cshtml nie byłyby poprzedzone podkreśleniem?
richb,
jeśli wszystkie pliki miałyby _ jako prefiks, to Twoja witryna nie działałaby ... pliki, które mają przedrostek _ są renderowane wewnątrz normalnej strony ... (dla częściowych), a mistrz witryny jest szablonem ... więc musi mieć treść być wyświetlane.
Juztin
Właśnie wypróbowałem to i IIS na moim komputerze nie obsługuje żadnych plików z katalogu Views. Nawet statyczne pliki .html. Więc naprawdę nie sądzę, że to jest odpowiedź.
richb,
Juztin: Pytanie brzmi, dlaczego zaczynają się od podkreślenia? Jeśli zmienię nazwę _Layout.cshtm na Layout.cshtml, nadal działa dobrze. Więc jaki jest powód tej konwencji?
richb,
2
Pytanie dotyczy mvc asp.net, a nie stron internetowych
fabspro
2

O ile wiem, jest to po prostu konwencja używana do określenia intencji pliku; Nie wierzę, że faktycznie zmieni to zachowanie pliku. W większości kontekstów programistycznych dodanie znaku podkreślenia na początku identyfikuje coś, co ma być przeznaczone do „prywatnego” użytku, czy to przez klasę, czy w tym przypadku inny szablon.

przyszłość
źródło
1

Nie używam MVC, ale w przypadku stron internetowych, które również używają składni maszynki do golenia, prefiks _ generalnie oznacza, że ​​strona nie jest przeznaczona do otwierania przez użytkownika, ale inne strony lub jakiś kod. Jeśli spróbujesz przejść do strony zawierającej _prefix, asp.net uniemożliwi dostęp do niej. Dlatego jest używany ze stronami układu i innymi podobnymi stronami, ponieważ użytkownik nie powinien mieć do nich bezpośredniego dostępu.

Coś takiego jak folder App_Code w asp.net

Travis
źródło
@MikeBrind Nie można „nawigować” do / przeglądać bezpośrednio żadnego z widoków /vieww domyślnym projekcie ASP.NET MVC; /views/web.configplik jest skonfigurowany aby temu zapobiec. Ale nic nie stoi na przeszkodzie, aby akcja kontrolera powróciła. View("_Index", model);Działa dobrze; Po prostu zrobiłem to, zmieniając nazwę widoku na _Index.cshtml i zmieniając akcję na call, tak jak powyżej.
Andrew Barber
@MikeBrind To pytanie dotyczy MVC, a nie stron internetowych. Zgoda; Nie wskazałem tego w moim pierwotnym komentarzu.
Andrew Barber
@MikeBrind Odpowiedziałem - i jestem - na odpowiedź. Nie twoje. Mój początkowy komentarz był mylący (wspomniałem też o „fragmentach”), więc go usunąłem. Chodziło mi o to, że podkreślenia nie mają nic wspólnego z niemożnością załadowania widoku w MVC. Ten użytkownik nawet zaczął mówić: „Nie używam MVC”, ale to pytanie dotyczyło MVC. Po prostu upewniam się, że ktoś, kto przyjdzie później, czytając odpowiedź, w jakiś sposób nie pomyśli, że w MVC podkreślenie wpływa na zdolność akcji kontrolera do załadowania widoku. Nie ma sprawy. Zgadzamy się, że nie miałam zamiaru mówić. Gotowe.
Andrew Barber