ASP.NET MVC объяснение @section

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

Я видел в этом примере, он добавляет @section в Index.cshtml. Является ли Index.cshtml общим представлением? Что в примере кода говорит "Использовать код @section в этом представлении, но не в этом представлении?".

Ответ 1

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

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

Изменить: на основе дополнительного уточнения вопроса

Синтаксис @RenderSection переходит в общий вид, например:

<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-ответе.

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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