Was ist @RenderSection in asp.net MVC?


170

Was ist der Zweck von @RenderSection und wie funktioniert es? Ich verstehe, was Bundles tun, aber ich muss noch herausfinden, was dies bewirkt, und es ist wahrscheinlich wichtig.

@RenderSection("scripts", required: false)

Vielleicht ein kleines Beispiel, wie man es benutzt?

Antworten:


287

Wenn Sie eine _Layout.cshtml-Ansicht wie diese haben

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

Dann können Sie eine Inhaltsansicht von index.cshtml wie diese haben

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

Das Erforderliche gibt an, ob die Ansicht auf der Layoutseite einen Skriptabschnitt enthalten muss


20

Wenn

(1) Sie haben eine _Layout.cshtml-Ansicht wie diese

<html>
    <body>
        @RenderBody()

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

(2) Sie haben 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) Sie haben About.cshtml

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

Wenn auf Ihrer Layoutseite bei Bedarf "false" @RenderSection ("scripts", erforderlich: false) "festgelegt ist, wird die Datei" contacts.js "nicht gerendert, wenn die Seite gerendert wird und sich der Benutzer auf einer Seite befindet.

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

Wenn erforderlich, wird "@RenderSection (" scripts ", erforderlich: true)" auf "true" gesetzt. Wenn die Seite gerendert wird und sich der Benutzer auf der Seite "ÜBER" befindet, wird "contacts.js STILL" gerendert.

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

KURZ, wenn auf true gesetzt , ob Sie es auf anderen Seiten benötigen oder nicht, wird es trotzdem gerendert. Wenn false festgelegt ist , wird nur gerendert, wenn die untergeordnete Seite gerendert wird.


16
das ist nicht richtig. Sie sollten Ihre Antwort selbst versuchen und Sie werden feststellen, dass Sie Section not defined: "scripts".beim Rendern Ihrer Info-Seite eine erhalten, wenn Sie das erforderliche Flag setzen true.
cgijbels

Nur eine Klarstellung. Sollte es nicht "Skripte" statt "Skripte" sein?
SRIDHARAN

2

Hier die Definition von Rendersection aus MSDN

Rendert auf Layoutseiten den Inhalt eines benannten Abschnitts. MSDN

In _layout.cs Seite setzen

@RenderSection("Bottom",false)

Hier wird der Inhalt des Bootom-Abschnitts gerendert und die falseboolesche Eigenschaft angegeben, um anzugeben, ob der Abschnitt erforderlich ist oder nicht.

@section Bottom{
       This message form bottom.
}

Das heißt, wenn Sie den unteren Abschnitt auf allen Seiten schließen möchten, müssen Sie false als zweiten Parameter bei der Rendersection-Methode verwenden.


2

Angenommen, ich habe 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>
    }

Und eine andere Ansicht "GetEmployeeDetails.cshtml" ohne Skripte

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

Und meine Layoutseite "_layout.cshtml"

@RenderSection("Scripts", required: true)

Wenn ich also zu GetEmployeeDetails.cshtml navigiere. Ich erhalte die Fehlermeldung, dass in GetEmployeeDetails.cshtml keine Abschnittsskripte gerendert werden müssen. Wenn ich das Flag @RenderSection()von required : true"Erforderlich: Falsch" ändere. Dies bedeutet, dass die in den @ section-Skripten der Ansichten definierten Skripte gerendert werden, falls vorhanden. Andernfalls nichts tun. Und der verfeinerte Ansatz wäre in _layout.cshtml

@if (IsSectionDefined("Scripts"))
    {
        @RenderSection("Scripts", required: true)
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.