Чому Razor _layout.cshtml має провідне підкреслення у назві файлу?


144

У проекті ASP.NET MVC 3 за замовчуванням компонування та часткові файли cshtml починаються з підкреслення

  • _viewstart
  • _Layout
  • _LogOnPartial

Чому ця конвенція і для чого це використовується? Чи потрібно дотримуватися цієї конвенції?

Чи надає рамки якийсь особливий сенс .cshtmlфайлу, який починається з підкреслення?


Я використовую NancyFX з Razor, оскільки, за замовчуванням, він обмежує будь-який вміст, який відсутній у папці Content. (Це може бути відмінено в web.config або користувальницькій конфігурації) неможливо взагалі обслуговувати будь-які файли, наприклад .cshtml. Тому я не використовую "_", попередньо призначений для моїх імен перегляду, тому що НЕ потрібен і некрасивий.
Норберт Норбертсон

Відповіді:


205

Razor був розроблений для веб-сторінок ASP.NET (WebMatrix), який не має вбудованого типу захисту щодо папок Views і маршрутизації, які ви отримуєте в MVC. Оскільки сторінки розмітки на Веб-сторінках не призначені для прямого обслуговування, вони мають префікс із підкресленням. Рамка веб-сторінок налаштована так, щоб заборонити безпосередньо запитувати файли з провідними підкресленнями у своїх іменах. Інші .cshtml-файли на веб-сторінках, як правило, повинні бути доступними для перегляду. Вони еквівалентні .asp або .php файлам.

Команда ASP.NET заявила, що веб-сторінки - це відправна точка в розробці ASP.NET, яка повинна привести до переходу на MVC вчасно (для тих, хто хоче рухатися далі). Частина цього означає, що переходити з веб-сторінок на MVC слід якомога простіше. Отже, має сенс переносити конвенції про іменування, створені на веб-сторінках, на файли MVC Razor.

Отже, є технічна причина для префіксації імен файлів підкресленням - це просто не стосується MVC.

[ОНОВЛЕННЯ Жовтень 2018]

У новому рамках ASP.NET Core Razor Pages (крім версії 2.1), файли з провідним підкресленням ігноруються, коли маршрути створюються при запуску, - навіть якщо вони мають @pageдирективу (яка зазвичай робить їх маршрутизованою сторінкою Razor) . Ось чому має сенс називати макет і часткові файли з провідним підкресленням у додатку Сторінки Razor Pages, якщо вони не призначені для перегляду.


6
Дякую. Для мене це найпроникливіша відповідь. Мені було неправильно зрозуміти, що Бритва прив’язана до MVC. Тепер я бачу, що причина головного підкреслення полягає в тому, щоб не допустити їх подачі безпосередньо під веб-сторінками ASP.NET.
richb

1
Конвенція про іменування, яка насправді пов'язана з функціональністю, я думав, що MS знатиме краще. А тепер його перенесли до MVC, який мав бути чистим шифером.
Борис Б.

Сподіваємось, що після поточних версій .NET Framework 4.5.1 та Visual Studio 2013, включаючи функцію "One ASP.NET", вони можуть нарешті відійти від цих технічних обмежень / жорсткого кодування. Звичайно, звичайні файли, якими ніколи не ділиться, важливо, як у поточних каталогах * .config, APP_Code та APP_Data. Але ця логіка повинна десь знаходитись у конфігураційному файлі (конфігурація машини за замовчуванням), щоб його можна було замінити. Крім того, ці назви загальних сторінок за замовчуванням повинні бути налаштовані (макет / помилка / тощо ...).
Тоні Уолл

1
@Daniel О, я бачу, що ти маєш на увазі. Відповідь я відредагував, оскільки вона не працює як рекламована.
Майк Брінд

1
@Daniel Те, що ви бачите, - це, мабуть, помилка, що з’явилася на сторінках Razor Pages 2.1. Це планується зафіксувати в 2.2. Він працює, як я описав у 2.0.
Майк Брінд

12

Ось так це робить Ruby on Rails (Партії починаються з _, але виклик Rending Partial не включає _), і ASP.net MVC почерпнув з цього велике натхнення.

Насправді немає жодної технічної причини, лише умова чітко показати наміри іншим розробникам (а також 6 місяців пізніше) сказати: Це частковий погляд.


це неправильно, як вказується у відповіді вище - підкреслення має функцію безпеки.
iJungleBoy

1
@iJungleBoy Дивіться прийняту відповідь. для ASP.net MVC (про яке йдеться у цьому питанні) функціонал безпеки не існує. Дивіться web.config у папці Views, яка вже блокує всі файли cshtml та aspx, підкреслюйте чи ні (встановлюється System.Web.HttpNotFoundHandlerдля них).
Майкл Стум

7

Сторінки, які не можуть бути відображені прямими запитами вашого браузера (головні сторінки, часткові перегляди тощо), мають наголос (_) на початку своїх назв.

Отже, якщо ви спробуєте зробити запит на _Layout.cshtml (це головна сторінка), ви отримаєте помилку від сервера.

Це спосіб розрізнити файли, які неможливо переглядати як окремі сторінки, в системі перегляду Razor.

Подумайте про це так ... у MVC 2 ... ви б розмежували частковий вигляд та майстер-сайт із суфіксом .master, .ascx та звичайними сторінками .aspx, з іншого боку, у поданні Razor ... всі перегляди є .cshtml, тому для розрізнення часткових та головних сторінок вони матимуть префікс (_). це нічого не обов'язкове, просто "конвенція".


4
Але за цією логікою, чи не всі файли cs & cshtml не мають префіксу з підкресленням?
richb

якщо всі файли матимуть _ як префікс, то ваш сайт не буде працювати ... файли з _prefix виводяться на звичайну сторінку ... (для партій), а sitemaster - це шаблон ... тож він повинен мати вміст, щоб відображатись.
Джузтін

Тому я просто спробував це, і IIS у моєму вікні не обслуговує жодних файлів із каталогу Views, перегляду. Навіть не статичні .html файли. Тож я справді не думаю, що це відповідь.
richb

Юзтін: Питання - чому вони починаються з підкреслення? Якщо я перейменую _Layout.cshtm на Layout.cshtml, він все одно працює чудово. То в чому причина цієї конвенції?
richb

2
Питання про asp.net mvc, а не веб-сторінки
fabspro

2

Наскільки мені відомо, це просто умова, що використовується для виявлення наміру файлу; Я не вірю, що це фактично змінить поведінку файлу. У більшості контекстів розробки, попередньо підкреслюючи, виділяється щось, що має бути призначене для "приватного" використання, чи то класом, чи то в цьому випадку іншим шаблоном.


1

Я не використовую MVC, але на веб-сторінках, які також використовують синтаксис бритви, префікс _ загалом означає, що сторінка призначена не для доступу користувача, а для інших сторінок або якогось коду. Якщо ви спробуєте перейти на сторінку, що містить _prefix, asp.net заборонить доступ до неї. Ось чому його використовується з сторінками розмітки та іншими такими сторінками, оскільки користувач не повинен отримувати доступ безпосередньо до них.

Щось на зразок папки App_Code в asp.net


@MikeBrind Ви не можете «перейти» до / переглядати безпосередньо будь-який із представлень даних /viewу проекті MVC за замовчуванням ASP.NET; /views/web.configфайл створений , щоб запобігти його. Але ніщо не перешкоджає поверненню дії контролера. View("_Index", model);Це працює просто чудово; Я щойно це зробив, змінивши ім'я перегляду на _Index.cshtml і змінивши дію на виклик, як я це робив вище.
Ендрю Барбер

@MikeBrind Це питання стосується MVC, а не веб-сторінок. Дозволено; Я цього не вказав у своєму первинному коментарі.
Ендрю Барбер

@MikeBrind я відповідав на цю відповідь. Не твій. Мій початковий коментар був оманливим (я теж згадував "часткові"), тому я його видалив. Моя думка полягала в тому, що підкреслення не має нічого спільного з тим, що не можна завантажити вигляд у MVC. Цей користувач навіть почав говорити: "Я не використовую MVC", але це питання стосувалося MVC. Я просто переконуюсь, що хтось піде пізніше, читаючи цю відповідь, якимось чином не вважає, що в MVC підкреслення впливає на здатність дії контролера завантажувати подання. Нічого страшного. Ми погоджуємось, що я був поміркований у тому, як я говорив. Зроблено.
Ендрю Барбер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.