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

ในหน้าเลย์เอาต์ของคุณหากจำเป็นต้องตั้งค่าเป็นเท็จ "@RenderSection (" สคริปต์ ", ต้องใช้: false)", เมื่อหน้าแสดงผลและผู้ใช้อยู่บนหน้าเพจ contacts.js จะไม่แสดงผล

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

หากจำเป็นต้องตั้งค่าเป็น "@RenderSection (" สคริปต์ "ที่จำเป็น: จริง)", เมื่อหน้าแสดงผลและผู้ใช้อยู่ในหน้าเกี่ยวกับหน้า contacts.js STILL จะแสดงผล

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

ในระยะสั้นเมื่อตั้งค่าเป็นจริงไม่ว่าคุณต้องการหรือไม่ในหน้าอื่น ๆ มันจะแสดงผลอย่างใด หากตั้งค่าเป็นเท็จมันจะแสดงผลเฉพาะเมื่อมีการแสดงหน้าเพจย่อย


16
สิ่งนี้ไม่ถูกต้อง คุณควรลองคำตอบของคุณกับตัวเองและคุณจะพบว่าคุณจะได้รับเมื่อแสดงผลหน้าเว็บเกี่ยวกับคุณเมื่อตั้งธงที่จำเป็นในการSection not defined: "scripts". true
cgijbels

เพียงชี้แจง ไม่ควรเป็น "สคริปต์" แทนที่จะเป็น "สคริปต์"
SRIDHARAN

2

ที่นี่การกำหนดของการแสดงผลจาก MSDN

ในหน้าเลย์เอาต์แสดงเนื้อหาของส่วนที่มีชื่อ MSDN

ในหน้า _layout.cs

@RenderSection("Bottom",false)

ที่นี่แสดงเนื้อหาของส่วน bootom และระบุfalseคุณสมบัติบูลีนเพื่อระบุว่าจำเป็นต้องใช้ส่วนหรือไม่

@section Bottom{
       This message form bottom.
}

ความหมายนั้นถ้าคุณต้องการที่จะส่วนล่างในทุกหน้าแล้วคุณต้องใช้เท็จเป็นพารามิเตอร์ที่สองที่วิธีการแสดงผล


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เป็น `` ต้องมี: false` มันหมายถึงการแสดงผลสคริปต์ที่กำหนดไว้ในสคริปต์ @section ของมุมมองถ้ามีอยู่อย่าทำอะไรเลย และวิธีการกลั่นจะเป็น _layout.cshtml

@if (IsSectionDefined("Scripts"))
    {
        @RenderSection("Scripts", required: true)
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.