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?

Aflred
quelle

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

cgijbels
quelle
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.

Maria Jesusa Galapon
quelle
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.

Brijesh Mavani
quelle
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)
    }
Vijay
quelle