Чому 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.