¿Qué es @RenderSection en asp.net MVC?

170

¿Cuál es el propósito de @RenderSection y cómo funciona? Entiendo lo que hacen los paquetes, pero todavía tengo que descubrir qué hace y probablemente sea importante.

@RenderSection("scripts", required: false)

¿Quizás un pequeño ejemplo sobre cómo usarlo?

Aflred
fuente

Respuestas:

287

Si tiene una vista _Layout.cshtml como esta

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

entonces puede tener una vista de contenido index.cshtml como esta

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

lo requerido indica si la vista que usa la página de diseño debe tener una sección de secuencias de comandos

cgijbels
fuente
20

Si

(1) tiene una vista _Layout.cshtml como esta

<html>
    <body>
        @RenderBody()

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

(2) tienes Contactos.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) tienes About.cshtml

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

En su página de diseño, si es necesario, se establece en falso "@RenderSection (" scripts ", requerido: falso)", cuando la página se representa y el usuario está en la página, los contactos.js no se procesan.

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

si se requiere se establece en verdadero "@RenderSection (" scripts ", requerido: verdadero)", Cuando la página se representa y el usuario está en la página ACERCA DE, se contacta TODOS los contactos .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>

EN CORTO, cuando se establece en verdadero , ya sea que lo necesite o no en otras páginas, se representará de todos modos. Si se establece en falso , solo se representará cuando se represente la página secundaria.

Maria Jesusa Galapon
fuente
16
Esto no es correcto. Debes probar tu respuesta tú mismo y notarás que obtendrás un mensaje Section not defined: "scripts".al representar tu página Acerca de cuando configures el marcador requerido true.
cgijbels
Solo una aclaración. ¿No deberían ser "guiones" en lugar de "guiones"?
SRIDHARAN
2

Aquí la definición de Rendersection de MSDN

En las páginas de diseño, representa el contenido de una sección con nombre. MSDN

En la página _layout.cs poner

@RenderSection("Bottom",false)

Aquí representa el contenido de la sección bootom y especifica la falsepropiedad booleana para especificar si la sección es obligatoria o no.

@section Bottom{
       This message form bottom.
}

Eso significa que si desea ir a la sección inferior en todas las páginas, debe usar falso como el segundo parámetro en el método Rendersection.

Brijesh Mavani
fuente
2

Supongamos que tengo 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>
    }

Y otra vista "GetEmployeeDetails.cshtml" sin scripts

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

Y mi página de diseño "_layout.cshtml"

@RenderSection("Scripts", required: true)

Entonces, cuando navego a GetEmployeeDetails.cshtml. Me sale el error de que no hay secuencias de comandos de sección para ser representados en GetEmployeeDetails.cshtml. Si cambio la bandera @RenderSection()de required : truea `` requerido: falso`. Significa renderizar los scripts definidos en los scripts @section de las vistas si están presentes. De lo contrario, no haga nada. Y el enfoque refinado estaría en _layout.cshtml

@if (IsSectionDefined("Scripts"))
    {
        @RenderSection("Scripts", required: true)
    }
Vijay
fuente