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

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

У меня есть пара вопросов (со ссылкой на статью выше):

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

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

121 голос | спросил A Bogus 26 +04002012-10-26T19:06:00+04:00312012bEurope/MoscowFri, 26 Oct 2012 19:06:00 +0400 2012, 19:06:00

4 ответа


0

@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 .

ответил Frazell Thomas 26 +04002012-10-26T19:11:20+04:00312012bEurope/MoscowFri, 26 Oct 2012 19:11:20 +0400 2012, 19:11:20
0

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

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

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

ответил John Mc 26 +04002012-10-26T19:11:33+04:00312012bEurope/MoscowFri, 26 Oct 2012 19:11:33 +0400 2012, 19:11:33
0

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

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

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

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

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

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

ответил ischell 26 +04002012-10-26T22:02:53+04:00312012bEurope/MoscowFri, 26 Oct 2012 22:02:53 +0400 2012, 22:02:53
0

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

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

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

ответил chrislhardin 26 +04002012-10-26T19:14:29+04:00312012bEurope/MoscowFri, 26 Oct 2012 19:14:29 +0400 2012, 19:14:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132