บังคับให้ทุกพื้นที่ใช้เลย์เอาต์เดียวกัน


88

ฉันมีโครงสร้างโครงการต่อไปนี้:

  • / Views / Shared / _Layout;

  • / พื้นที่ / Area1 / มุมมอง / ControllerName / ดัชนี;

...

  • / Areas / AreaN / Views / ControllerName / Index.

มีวิธีที่จะบังคับให้ทุกพื้นที่การใช้งานใด ๆ_Layoutเป็นรูปแบบฐาน ?

มีวิธีใดบ้างที่จะทำได้โดยไม่ต้องเพิ่มไฟล์_ViewStart (ตัวอย่างเช่นผ่านการกำหนดค่าการกำหนดเส้นทาง)

ดูสิ่งนี้ด้วย:

ฉันจะระบุเลย์เอาต์ที่แตกต่างกันในไฟล์ ASP.NET MVC 3 razor ViewStart ได้อย่างไร


คำตอบ:


157

คุณต้องเพิ่มไฟล์ชื่อ:

_ViewStart.cshtml

ภายใต้โฟลเดอร์มุมมองแต่ละพื้นที่:

/Areas/Area1/Views/_ViewStart.cshtml

และแก้ไขไฟล์ให้ชี้ไปที่เค้าโครงรูทดังนี้:

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

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

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

แก้ไข 1

หากคุณต้องการใช้โค้ดเพื่อตั้งค่าเค้าโครงของมุมมองเริ่มต้นบางทีคุณควรพิจารณาเขียนเครื่องมือดูแบบกำหนดเอง

ลอง Google เกี่ยวกับประเพณีRazorViewEngineและRazorView

บทความนี้อาจเป็นจุดเริ่มต้นที่ดี

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

ฉันไม่ได้ทำอะไรแบบนี้ แต่ฉันหวังว่าฉันจะชี้คุณไปในทิศทางที่ถูกต้อง


1
มีวิธีใดบ้างที่จะทำได้โดยไม่ต้องเพิ่มไฟล์ "_ViewStart" (เช่นผ่านการกำหนดค่าการกำหนดเส้นทาง)
Mikhail

2
ภายในเส้นทางฉันไม่คิดอย่างนั้น เป็นสองสิ่งที่แตกต่างกัน การกำหนดเส้นทางมีหน้าที่พยายามจับคู่ URL คำขอปัจจุบันกับเส้นทางที่ลงทะเบียนใน RoutesTable เมื่อพบรายการที่ตรงกัน IMvcRouteHandler จะถูกสร้างขึ้นจากนั้น IHttpHandler (MvcHandler) จะรับผิดชอบในการดำเนินการกับคอนโทรลเลอร์ของคุณ อย่างที่คุณเห็นสิ่งนี้ไม่เกี่ยวข้องกับมุมมองหรือเค้าโครง เนื่องจากเส้นทางไม่จำเป็นต้องส่งคืนมุมมองเส้นทางอาจส่งคืน json หรือ xml ดังนั้นการกำหนดเส้นทางจึงไม่ใช่สถานที่ที่ถูกต้องในการใช้สิ่งนี้
Jupaol

คุณยังสามารถเพิ่ม_ViewStartโดยตรงในโฟลเดอร์ Area โดยตรงเพื่อนำไปใช้กับทุกพื้นที่
Artur

21

ขยายความโดย Jupaol ....

อย่างน้อยใน VS2013 ไฟล์ _ViewStart.cshtml จะถูกเพิ่มโดยค่าเริ่มต้นเมื่อสร้างพื้นที่ดังนั้นจึงมีอยู่แล้วและคุณสามารถเปลี่ยนเนื้อหาได้ตามที่เขาบันทึกให้ชี้ไปที่รูท _Layout.cshtml จากนั้นคุณสามารถลบ _Layout.cshtml ในพื้นที่ได้เนื่องจากไม่มีการใช้งานอีกต่อไป (และอาจเป็นสาเหตุของความสับสนในขณะนี้)

อย่างไรก็ตามการกำหนดเส้นทางใด ๆ ที่ดำเนินการในรูท _Layout.cshtml นั้นจะต้องพิจารณาพื้นที่
_Layout.cshtml เริ่มต้นมีตัวช่วย ActionLink จำนวนหนึ่งที่ต้องการการแก้ไขเล็กน้อย:

เพิ่มพารามิเตอร์ RouteValueDictionary ให้กับการเรียก ActionLink โดยการตั้งค่า Area = "" โปรดสังเกตว่าสตริงว่างหมายถึงระดับราก ซึ่งจะช่วยให้ลิงก์เหล่านี้ทำงานได้อย่างถูกต้องเมื่อเรียกใช้จากภายในพื้นที่ แต่ยังคงใช้งานได้เมื่อเรียกใช้จากรูท

เช่น:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>

2

คุณระบุเค้าโครงโดยใช้:

@ {Layout = "_Layout"; }

หากคุณต้องการทำให้การเปลี่ยนแปลงทั้งหมดนี้ง่ายขึ้นในคราวเดียว บางทีคุณอาจตั้งค่าเป็นตัวแปรกระเป๋ามุมมองและส่งต่อไปที่คอนโทรลเลอร์ก็ได้ เพื่อให้ง่ายยิ่งขึ้นคุณสามารถสร้างตัวควบคุมพื้นฐานที่ตัวควบคุมอื่น ๆ สืบทอดมาและกำหนดเค้าโครงให้กับกระเป๋ามุมมองที่นั่น

ไม่แน่ใจว่าทำไมการกำหนดเส้นทางจึงต้องเปลี่ยนหรือบางทีฉันก็ไม่เข้าใจ หวังว่านี่จะช่วยได้ :)

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