Что такое @RenderSection в asp.net MVC


170

Какова цель @RenderSection и как он работает? Я понимаю, что делают комплекты, но мне еще предстоит выяснить, что это делает, и это, вероятно, важно.

@RenderSection("scripts", required: false)

Возможно, небольшой пример о том, как его использовать?

Ответы:


287

Если у вас есть представление _Layout.cshtml, как это

<html>
    <body>
        @RenderBody()
        @RenderSection("scripts", required: false)
    </body>
</html>

тогда вы можете иметь представление содержимого index.cshtml, как это

@section scripts {
     <script type="text/javascript">alert('hello');</script>
}

требуется указывает , является ли вид с помощью страницы макета должны иметь раздел скриптов


20

Если

(1) у вас есть представление _Layout.cshtml, как это

<html>
    <body>
        @RenderBody()

    </body>
    <script type="text/javascript" src="~/lib/layout.js"></script>
    @RenderSection("scripts", required: false)
</html>

(2) у вас есть Contacts.cshtml

@section Scripts{
    <script type="text/javascript" src="~/lib/contacts.js"></script>

}
<div class="row">
    <div class="col-md-6 col-md-offset-3">
        <h2>    Contacts</h2>
    </div>
</div>

(3) у вас есть About.cshtml

<div class="row">
    <div class="col-md-6 col-md-offset-3">
        <h2>    Contacts</h2>
    </div>
</div>

На странице макета, если требуется, установлено значение false "@RenderSection (" scripts ", required: false)", когда страница отображается и пользователь находится около страницы, contacts.js не отображает.

    <html>
        <body><div>About<div>             
        </body>
        <script type="text/javascript" src="~/lib/layout.js"></script>
    </html>

если обязательный параметр установлен в значение «@RenderSection (« scripts », required: true)», когда страница отображается и пользователь находится на странице «О», то contact.js ОСТАЕТСЯ визуализированным.

<html>
    <body><div>About<div>             
    </body>
    <script type="text/javascript" src="~/lib/layout.js"></script>
    <script type="text/javascript" src="~/lib/contacts.js"></script>
</html>

КОРОТКО, если задано значение true , нужно ли вам это или нет на других страницах, оно все равно будет отображаться. Если задано значение false , оно будет отображаться только при отображении дочерней страницы.


16
это не правильно. Вы должны попробовать свой ответ самостоятельно, и вы заметите, что вы получите, Section not defined: "scripts".когда будете отображать страницу «О нас» при установке необходимого флага true.
cgijbels

Просто уточнение. Разве это не должны быть «сценарии» вместо «сценарии»?
SRIDHARAN

2

Здесь определение Rendersection от MSDN

На страницах макета отображает содержимое именованного раздела. MSDN

На странице _layout.cs положить

@RenderSection("Bottom",false)

Здесь визуализируется содержимое раздела bootom и указывается falseлогическое свойство, чтобы указать, является ли раздел обязательным или нет.

@section Bottom{
       This message form bottom.
}

Это означает, что если вы хотите использовать нижний раздел на всех страницах, то вы должны использовать false в качестве второго параметра в методе Rendersection.


2

Предположим, если у меня есть GetAllEmployees.cshtml

<h2>GetAllEmployees</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
         // do something ...
    </thead>
    <tbody>
       // do something ...
    </tbody>
</table>

   //Added my custom scripts in the scripts sections

@section Scripts
    {
    <script src="~/js/customScripts.js"></script>
    }

И еще одно представление «GetEmployeeDetails.cshtml» без сценариев

<h2>GetEmployeeByDetails</h2>

@Model.PageTitle
<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
       // do something ... 
    </thead>
    <tbody>
       // do something ...
    </tbody>
</table>

И мой макет страницы "_layout.cshtml"

@RenderSection("Scripts", required: true)

Итак, когда я перехожу к GetEmployeeDetails.cshtml. Я получаю сообщение об ошибке, что в GetEmployeeDetails.cshtml нет скриптов раздела. Если я поменяю флаг @RenderSection()с required : trueна `` required: false`. Это означает визуализацию сценариев, определенных в сценариях @section представлений, если они есть. Иначе ничего не делать. И изысканный подход был бы в _layout.cshtml

@if (IsSectionDefined("Scripts"))
    {
        @RenderSection("Scripts", required: true)
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.