ASP.NET MVC: какова цель @section? [закрыто]

132

Я видел эту статью в блоге для приложения ASP.NET MVC . Автор ScottGu добавляет @sectionв Index.cshtml.

У меня есть пара вопросов (относящихся к статье выше):

  • Является ли Index.cshtml общим представлением?
  • В примере кода используется @sectionкод в конкретном представлении. Зачем?

Может кто-нибудь объяснить, почему и когда я буду использовать @sectionв представлении?

Поддельный
источник
4
Взгляните на этот учебник: weblogs.asp.net/scottgu/archive/2010/12/30/…
Адриано Репетти
1
Хотя можно утверждать, что сегодня более веская причина закрытия будет «в первую очередь основанной на мнениях», она все равно будет закрыта. Не существует однозначного способа использования разделов.
Ричард
2
Нет однозначного способа что-либо использовать. Просто посмотрите, как люди пользуются Интернетом ...
Кэджи

Ответы:

138

@sectionпредназначен для определения содержимого, которое переопределяется из общего представления. По сути, это способ настроить ваше общее представление (аналогично мастер-странице в веб-формах).

Вы можете найти статью Скотта Гу об этом очень интересной .

Изменить: на основе дополнительных разъяснений вопроса

@RenderSectionСинтаксис переходит в Shared View, такие как:

<div id="sidebar">
    @RenderSection("Sidebar", required: false)
</div>

Затем это будет помещено в ваше представление с @Sectionсинтаксисом:

@section Sidebar{
    <!-- Content Here -->
}

В MVC3 + вы можете либо определить файл макета, который будет использоваться непосредственно для представления, либо вы можете иметь представление по умолчанию для всех представлений.

Общие параметры представления могут быть установлены в _ViewStart.cshtml, который определяет представление макета по умолчанию, подобное этому:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Вы также можете настроить общий вид для использования непосредственно в файле, например index.cshtml, как показано в этом фрагменте.

@{
    ViewBag.Title = "Corporate Homepage";
    ViewBag.BodyID = "page-home";
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

Есть множество способов отрегулировать этот параметр, и еще несколько, упомянутых в этом ответе SO .

Фразелл Томас
источник
Спасибо Frazell! Я добавил больше к своему вопросу в связи с этим учебником. Вы можете объяснить дальше? Еще раз спасибо!
Поддельный
Привет, @ABogus, я обновил ответ. Надеюсь, эта дополнительная информация будет полезна :)
Frazell Thomas
21

Хороший пример - Javascript. Вы хотите, чтобы это было внизу страницы, отображаемой в браузере, потому что это лучшая практика.

Как бы вы сделали это из представления на основе макета / мастер-страницы, где вы можете получить доступ только к середине страницы?

Вы делаете это, объявляя раздел Scripts внизу страницы Layout. Затем вы можете добавить контент, в этом случае Javascript включает (я надеюсь!), Со страницы просмотра в нижнюю часть страницы макета.

Джон Мак
источник
4

Вы хотите использовать разделы, когда хотите, чтобы небольшой фрагмент кода / контента отображался в заполнителе, который был определен на странице макета.

В конкретном примере, который вы связали, он определил RenderSection в _Layout.cshtml. Любое представление, использующее этот макет, может определять @section с тем же именем, которое определено в макете, и оно заменит вызов RenderSection в макете.

Возможно, вам интересно, откуда мы знаем, что Index.cshtml использует этот макет? Это связано с некоторыми соглашениями MVC / Razor. Если вы посмотрите на диалоговое окно, в котором он добавляет представление, будет отмечено поле «Использовать макет или главную страницу», а чуть ниже него написано «Оставить пустым, если он установлен в файле Razor _viewstart». Это не показано, но внутри этого файла _ViewStart.cshtml есть код вроде:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Принцип работы viewstart заключается в том, что любой файл cshtml в том же каталоге или дочерних каталогах запускает ViewStart до того, как он запустится сам.

Это говорит нам о том, что Index.cshtml использует Shared / _Layout.cshtml.

ischell
источник
Хорошее объяснение _ViewStart.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ 05
3

Он позволяет вам определять @Sectionкод в вашем шаблоне, который затем можно включить в другие файлы. Например, на боковую панель, определенную в шаблоне, можно ссылаться в другом включенном представлении.

//This could be used to render a @Section defined as @Section SideBar { ...
@RenderSection("SideBar", required: false);

Надеюсь это поможет.

chrislhardin
источник