ASP.NET MVC: จุดประสงค์ของ @section คืออะไร? [ปิด]


132

สำหรับโปรแกรมประยุกต์ ASP.NET MVC ผมเห็นบทความบล็อกนี้ ผู้เขียน ScottGu เพิ่ม@sectionลงใน Index.cshtml

ฉันมีคำถามสองสามข้อ (อ้างอิงจากบทความด้านบน):

  • Index.cshtml เป็นมุมมองที่แชร์หรือไม่
  • โค้ดตัวอย่างใช้@sectionโค้ดในมุมมองเฉพาะ ทำไม?

ใครช่วยอธิบายเหตุผลและเวลาที่ฉันจะใช้@sectionใน View ได้ไหม


4
ดูบทช่วยสอนนี้: weblogs.asp.net/scottgu/archive/2010/12/30/…
Adriano Repetti

1
ในขณะที่สามารถโต้แย้งได้ว่าเหตุผลในการปิดที่ดีกว่าในวันนี้คือ "ตามความคิดเห็นเป็นหลัก" แต่ก็ยังคงปิดอยู่ ไม่มีวิธีที่ชัดเจนในการใช้ส่วนต่างๆ
Richard

2
ไม่มีวิธีใช้อะไรที่แน่ชัด แค่ดูว่าคนใช้อินเทอร์เน็ต ...
keji

คำตอบ:


138

@sectionมีไว้สำหรับการกำหนดเนื้อหาจะถูกแทนที่จากมุมมองที่ใช้ร่วมกัน โดยทั่วไปแล้วเป็นวิธีที่คุณสามารถปรับมุมมองที่ใช้ร่วมกันของคุณ (คล้ายกับ Master Page ใน Web Forms)

คุณอาจพบการเขียนสกอตต์ Gu ขึ้นเกี่ยวกับเรื่องนี้น่าสนใจมาก

แก้ไข: อ้างอิงจากการชี้แจงคำถามเพิ่มเติม

@RenderSectionไวยากรณ์จะเข้าสู่ที่ใช้ร่วมกันดูเช่น:

<div id="sidebar">
    @RenderSection("Sidebar", required: false)
</div>

จากนั้นสิ่งนี้จะถูกวางไว้ในมุมมองของคุณด้วย@Sectionไวยากรณ์:

@section Sidebar{
    <!-- Content Here -->
}

ใน MVC3 + คุณสามารถกำหนดไฟล์เค้าโครงที่จะใช้สำหรับมุมมองได้โดยตรงหรือคุณสามารถมีมุมมองเริ่มต้นสำหรับมุมมองทั้งหมดก็ได้

การตั้งค่ามุมมองทั่วไปสามารถตั้งค่าได้ใน _ViewStart.cshtml ซึ่งกำหนดมุมมองเค้าโครงเริ่มต้นที่คล้ายกับสิ่งนี้:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

คุณยังสามารถตั้งค่ามุมมองที่ใช้ร่วมกันเพื่อใช้ในไฟล์โดยตรงเช่น index.cshtml ได้โดยตรงตามที่แสดงในตัวอย่างข้อมูลนี้

@{
    ViewBag.Title = "Corporate Homepage";
    ViewBag.BodyID = "page-home";
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

มีหลายวิธีที่คุณสามารถปรับการตั้งค่านี้ได้โดยมีการกล่าวถึงอีกสองสามวิธีในคำตอบ SOนี้


ขอบคุณ Frazell! ฉันได้เพิ่มคำถามเพิ่มเติมในการอ้างอิงถึงบทช่วยสอนนั้น ช่วยอธิบายเพิ่มเติมได้ไหม ขอบคุณอีกครั้ง!
หลอกลวง

เฮ้ @ABogus ฉันอัปเดตคำตอบ หวังว่าข้อมูลเพิ่มเติมนี้จะเป็นประโยชน์ :)
Frazell Thomas

21

ตัวอย่างที่ดีคือ Javascript คุณต้องการให้สิ่งนี้อยู่ที่ด้านล่างของหน้าที่แสดงผลในเบราว์เซอร์เพราะนี่เป็นแนวทางปฏิบัติที่ดีที่สุด

คุณจะทำสิ่งนี้ได้อย่างไรจากมุมมองตาม Layout / Masterpage ซึ่งคุณสามารถเข้าถึงได้เฉพาะตรงกลางของหน้าเท่านั้น

คุณทำได้โดยการประกาศส่วนสคริปต์ที่ด้านล่างของหน้าเค้าโครง จากนั้นคุณสามารถเพิ่มเนื้อหาได้ในกรณีนี้ Javascript จะรวมถึง (ฉันหวังว่า!) จากหน้า View ของคุณไปที่ด้านล่างของหน้าเค้าโครงของคุณ


4

คุณต้องการใช้ส่วนต่างๆเมื่อคุณต้องการให้โค้ด / เนื้อหาบิตแสดงผลในตัวยึดตำแหน่งที่กำหนดไว้ในหน้าเค้าโครง

ในตัวอย่างเฉพาะที่คุณเชื่อมโยงเขาได้กำหนด RenderSection ใน _Layout.cshtml มุมมองใด ๆ ที่ใช้เค้าโครงนั้นสามารถกำหนด @section ของชื่อเดียวกับที่กำหนดไว้ใน Layout และจะแทนที่การเรียก RenderSection ในเค้าโครง

บางทีคุณอาจสงสัยว่าเรารู้ได้อย่างไรว่า Index.cshtml ใช้รูปแบบนั้น? นี่เป็นเพราะหลักการ MVC / Razor เล็กน้อย หากคุณดูกล่องโต้ตอบที่เขากำลังเพิ่มมุมมองจะมีการทำเครื่องหมายที่ช่อง "ใช้เค้าโครงหรือหน้าต้นแบบ" และด้านล่างจะระบุว่า "เว้นว่างไว้หากตั้งค่าไว้ในไฟล์ Razor _viewstart" ไม่ปรากฏ แต่ภายในไฟล์ _ViewStart.cshtml นั้นมีรหัสดังนี้:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

วิธีการทำงานของ viewstarts คือไฟล์ cshtml ใด ๆ ภายในไดเร็กทอรีหรือไดเร็กทอรีย่อยเดียวกันจะเรียกใช้ ViewStart ก่อนที่จะรันเอง

ซึ่งเป็นสิ่งที่บอกเราว่า Index.cshtml ใช้ Shared / _Layout.cshtml


คำอธิบายที่ดีของ _ViewStart
ᴍᴀᴛᴛʙᴀᴋᴇʀ

3

ช่วยให้คุณสามารถกำหนด@Sectionรหัสในเทมเพลตของคุณซึ่งคุณสามารถรวมไว้ในไฟล์อื่น ๆ ได้ ตัวอย่างเช่นแถบด้านข้างที่กำหนดไว้ในเทมเพลตสามารถอ้างอิงได้ในมุมมองอื่นที่รวมไว้

//This could be used to render a @Section defined as @Section SideBar { ...
@RenderSection("SideBar", required: false);

หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.