Co to jest @RenderSection w asp.net MVC


170

Jaki jest cel @RenderSection i jak działa? Rozumiem, do czego służą pakiety, ale jeszcze nie wiem, co to robi i prawdopodobnie jest to ważne.

@RenderSection("scripts", required: false)

Może mały przykład, jak go używać?

Odpowiedzi:


287

Jeśli masz taki widok _Layout.cshtml

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

wtedy możesz mieć widok zawartości index.cshtml w ten sposób

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

wymagane wskazuje, czy widok za pomocą strony układu musi mieć przekrój scripts


20

Jeśli

(1) masz widok _Layout.cshtml taki jak ten

<html>
    <body>
        @RenderBody()

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

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

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

Na twojej stronie układu, jeśli wymagane jest ustawione na false "@RenderSection (" scripts ", required: false)", Kiedy strona jest renderowana, a użytkownik jest na stronie, plik contacts.js nie jest renderowany.

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

jeśli wymagane jest ustawione na true "@RenderSection (" scripts ", required: true)", Kiedy strona jest renderowana, a użytkownik znajduje się na stronie ABOUT, plik contacts.js STILL jest renderowany.

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

W SKRÓCIE, jeśli ustawione na true , czy tego potrzebujesz, czy nie na innych stronach, i tak zostanie wyrenderowane. Jeśli ustawiona na false , będzie renderowana tylko wtedy, gdy strona podrzędna jest renderowana.


16
to nie jest poprawne. Powinieneś wypróbować swoją odpowiedź samodzielnie, a zauważysz, że Section not defined: "scripts".podczas renderowania strony Informacje podczas ustawiania wymaganej flagi zostanie wyświetlony symbol true.
cgijbels

Tylko wyjaśnienie. Czy nie powinno to być „skrypty” zamiast „skrypty”?
SRIDHARAN,

2

Tutaj definicja Rendersection from MSDN

Na stronach układu renderuje zawartość nazwanej sekcji. MSDN

Na stronie _layout.cs umieść

@RenderSection("Bottom",false)

Tutaj renderuj zawartość sekcji bootom i falseokreśl właściwość logiczną, aby określić, czy sekcja jest wymagana, czy nie.

@section Bottom{
       This message form bottom.
}

Oznacza to, że jeśli chcesz mieć dolną sekcję na wszystkich stronach, musisz użyć false jako drugiego parametru w metodzie Rendersection.


2

Załóżmy, że mam 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>
    }

I kolejny widok „GetEmployeeDetails.cshtml” bez skryptów

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

A moja strona układu „_layout.cshtml”

@RenderSection("Scripts", required: true)

Tak więc, kiedy przechodzę do GetEmployeeDetails.cshtml. Otrzymuję błąd, że w GetEmployeeDetails.cshtml nie ma skryptów sekcji do renderowania. Jeśli zmienię flagę @RenderSection()z required : truena „wymagane: fałsz”. Oznacza to renderowanie skryptów zdefiniowanych w skryptach @section widoków, jeśli są obecne. A dopracowane podejście byłoby w _layout.cshtml

@if (IsSectionDefined("Scripts"))
    {
        @RenderSection("Scripts", required: true)
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.