วิธีที่ถูกต้องในการใช้ _viewstart.cshtml และมุมมองมีดโกนบางส่วน?


156

ฉันใช้_viewstart.cshtmlเพื่อกำหนดมีดโกนรูปแบบเดียวกันให้กับมุมมองของฉันโดยอัตโนมัติ

เป็นไฟล์แบบง่าย ๆ ที่อยู่ในรูทของโฟลเดอร์ Views ของฉันที่มีลักษณะดังนี้:

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

นี่คือ DRY มากกว่าการเพิ่มคำสั่ง @Layout ในทุก ๆ มุมมอง

อย่างไรก็ตามสิ่งนี้ทำให้เกิดปัญหาสำหรับมุมมองบางส่วนของ Razor เนื่องจากพวกเขาเรียกใช้เนื้อหาของ _viewstart.cshtml ดังนั้นจึงกำหนดรูปแบบตัวเองอย่างไม่ถูกต้องซึ่งทำให้พวกเขาเอ่อไม่ใช่บางส่วนอีกต่อไป

นี่คือโครงการสมมุติซึ่งแสดงไฟล์ _viewstart.cshtml, ไฟล์ _layout.shtml ที่ใช้ร่วมกันและมุมมองบางส่วน ("AnonBar.cshtml")

ตัวอย่างโครงสร้างโครงการ

ปัจจุบันวิธีที่ฉันได้รับรอบนี้คือการเพิ่มบรรทัดต่อไปนี้ในทุกมุมมองบางส่วน:

@{
    Layout = "";
}

ดูเหมือนว่าวิธีการที่ผิดในการแสดงว่ามุมมองเป็นส่วนหนึ่งในมีดโกน (โปรดทราบว่าไม่เหมือนกับเอ็นจิ้นดูเว็บฟอร์มส่วนขยายไฟล์จะเหมือนกันสำหรับบางส่วนของมุมมอง)

ตัวเลือกอื่น ๆ ที่ฉันพิจารณา แต่นั่นแย่กว่า:

  • วางมุมมองบางส่วนทั้งหมดลงในโฟลเดอร์ทั่วไปเพื่อให้พวกเขาสามารถแบ่งปัน _viewstart.cshtml ทั่วไป สิ่งนี้จะทำให้การประชุมของมุมมองอยู่ในโฟลเดอร์เดียวกับตัวควบคุม
  • ไม่ได้ใช้มุมมองบางส่วน

นี่เป็นบางสิ่งที่ยังคงถูกถ่ายทอดออกมาโดยทีมงานของ Razor View Engine หรือฉันขาดแนวคิดพื้นฐานหรือไม่?


3
ขออภัยเป็น offtopic แต่ไอคอนเหล่านั้นอยู่ถัดจากชื่อไฟล์คืออะไร :) การควบคุมแหล่งที่มาบางอย่างใช่มั้ย
อเล็กซ์

6
@jitbit: VisualSVN
ลบ

คำตอบ:


237

หากคุณreturn PartialView()จากผู้ควบคุม (แทนreturn View()) _viewstart.cshtmlจะไม่ถูกดำเนินการ


6
อ่าไม่รู้เกี่ยวกับPartialViewResultชั้นเรียน นั่นคือสิ่งที่ฉันต้องการ
พอร์ตแมน

6
ในฐานะที่เป็นติดตามฉันพบว่าฉันต้องยังกำหนดอย่างชัดเจนชนิดการส่งคืนของวิธีการดำเนินการที่จะแทนปกติPartialViewResult ActionResult
Portman

2
@Portman คุณเห็นปัญหาเมื่อประเภทการส่งคืนของวิธีการดำเนินการไม่ใช่ActionResultหรือไม่ ฉันประหลาดใจที่ปัญหานี้เกิดขึ้นเนื่องจาก MVC รันไทม์ไม่ควรทำงานแตกต่างกันในกรณีนี้ (เช่นตราบใดที่ประเภทที่ส่งคืนโดยวิธีการดำเนินการเป็นActionResultคลาสใดก็ตามที่ได้มาจากมันควรจะใช้ได้)
marcind

@marcind ฉันได้รับมากเกิน Stack ใน w3wp.exe ActionResultถ้าผมตั้งชนิดกลับไป PartialViewResultทำงานได้ดีถ้าประเภทกลับเป็น คิดว่าฉันต้องยื่นข้อผิดพลาดการเชื่อมต่อ?
Portman

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