Почему Razor _layout.cshtml имеет подчеркивание в имени файла?

144

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

  • _viewstart
  • _Layout
  • _LogOnPartial

Почему это соглашение и для чего оно используется? Должен ли я следовать этой конвенции?

Придает ли каркас какой-то особый смысл .cshtmlфайлу, который начинается с подчеркивания?

richb
источник
Я использую NancyFX с Razor, и по умолчанию он ограничивает любой контент, который не находится в папке «Контент». (Это может быть переопределено в web.config или в пользовательской конфигурации), невозможно обслуживать любые файлы, такие как .cshtml напрямую. Так что я не использую «_» перед именами моих представлений, потому что это НЕ обязательно и некрасиво.
Норберт Норбертсон

Ответы:

205

Razor был разработан для веб-страниц ASP.NET (WebMatrix), которые не имеют встроенной защиты в отношении папок Views и Routing, которые вы получаете в 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
Спасибо. Для меня это самый проницательный ответ. Я был в заблуждении, что Razor был привязан к MVC. Теперь я вижу, что причина в подчеркивании заключается в том, что они не могут обслуживаться непосредственно на веб-страницах ASP.NET.
Ричб
1
Соглашение об именах, которое на самом деле связано с функциональностью, я думал, что MS будет знать лучше. И теперь это перенесено в MVC, который должен был быть с чистого листа.
Борис Б.
Надеемся, что после выпуска текущих версий .NET Framework 4.5.1 и Visual Studio 2013, включающих функциональность «One ASP.NET», они наконец смогут отойти от этих технических ограничений / жесткого кодирования. Конечно, наличие стандартных файлов, которые никогда не передаются, важно, как и в текущих каталогах * .config, APP_Code и APP_Data. Но эта логика должна находиться где-то в файле конфигурации (по умолчанию в конфигурации компьютера), чтобы ее можно было переопределить. Также эти имена по умолчанию для общих страниц должны быть настраиваемыми (Layout / Error / etc ...).
Тони Уолл
1
@ Даниэль О, я понимаю, что ты имеешь в виду. Я отредактировал ответ, потому что он не работает так, как рекламируется.
Майк Бринд
1
@Daniel То, что вы видите, это ошибка, обнаруженная в Razor Pages 2.1. Это планируется исправить в 2.2. Это работает, как я описал в 2.0.
Майк Бринд
12

Вот как это делает Ruby on Rails (Partials начинается с _, но вызов Render Partial не включает _), и ASP.net MVC черпал из этого вдохновение.

На самом деле никаких технических причин, просто соглашение, которое четко показывает намерение других разработчиков (и вас самих через 6 месяцев) сказать: это частичное мнение.

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

Страницы, которые не могут быть показаны прямыми запросами вашего браузера (главные страницы, частичные просмотры и т. Д.), Имеют подчеркивание (_) в начале своих имен.

Поэтому, если вы попытаетесь сделать запрос к _Layout.cshtml (это главная страница), вы получите сообщение об ошибке от сервера.

Это способ отличить файлы, которые нельзя просматривать как отдельные страницы, в Razor View Engine.

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

Juztin
источник
4
Но по этой логике ВСЕ файлы cs & cshtml должны иметь префикс подчеркивания?
Ричб
если все файлы будут иметь префикс _, то ваш сайт не будет работать ... файлы с _prefix отображаются на обычной странице ... (для частичных), а сайт-мастер - это шаблон ... поэтому он должен иметь контент для отображаться.
Жузтин
Итак, я только что попробовал это, и IIS на моем компьютере не обслуживает файлы из каталога Views. Даже не статичные файлы .html. Так что я действительно не думаю, что это ответ.
Ричб
Юзтин: Вопрос в том, почему они начинаются с подчеркивания? Если я переименую _Layout.cshtm в Layout.cshtml, он все равно будет работать нормально. Так в чем же причина этого соглашения?
Ричб
2
Вопрос о asp.net mvc, а не о веб-страницах
fabspro
2

Насколько я знаю, это просто соглашение, используемое для определения цели файла; Я не верю, что это на самом деле изменит поведение файла. В большинстве контекстов разработки добавление подчеркивания идентифицирует что-то, что должно быть предназначено для «частного» использования, будь то класс или, в данном случае, другой шаблон.

futureal
источник
1

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

Что-то вроде папки App_Code в asp.net

Travis
источник
@MikeBrind Вы не можете «переходить» к / просматривать напрямую ни одно из представлений /viewв проекте ASP.NET MVC по умолчанию; /views/web.configфайл создан , чтобы предотвратить его. Но ничто не мешает возврату действия контроллера. View("_Index", model);Он работает просто отлично; Я просто сделал это, изменив имя представления на _Index.cshtml и изменив действие для вызова, как я делал выше.
Эндрю Барбер
@MikeBrind Этот вопрос касается MVC, а не веб-страниц. Предоставляется; Я не указал это в своем первоначальном комментарии.
Эндрю Барбер
@MikeBrind Я отвечал и отвечаю на этот ответ. Не ваш. Мой первоначальный комментарий вводил в заблуждение (я также упомянул «частичные»), поэтому я удалил его. Моя точка зрения была и заключается в том, что подчеркивания не имеют ничего общего с невозможностью загрузить представление в MVC. Этот пользователь даже начал говорить: «Я не использую MVC», но этот вопрос был о MVC. Я просто хочу убедиться, что кто-то придет позже, читая этот ответ, не думает, что в MVC подчеркивание влияет на способность действия контроллера загружать представление. Ничего страшного. Мы согласны, что я был невнимателен в том, как я говорил. Готово.
Эндрю Барбер