มีการกำหนดส่วนต่อไปนี้ แต่ยังไม่ได้แสดงผลสำหรับหน้าเค้าโครง“ ~ / Views / Shared / _Layout.cshtml”:“ Scripts”


101

ฉันยังใหม่กับ ASP MVC และใช้บทแนะนำเกี่ยวกับ ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

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

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

มีการกำหนดส่วนต่อไปนี้ แต่ยังไม่ได้แสดงผลสำหรับหน้าเค้าโครง> "~ / Views / Shared / _Layout.cshtml": "Scripts"

แทนที่จะใช้ Visual Studio express ฉันเลือกที่จะดาวน์โหลด Visual Studio 2012 RC (ไม่แน่ใจว่านั่นจะเป็นสาเหตุของปัญหาหรือไม่

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

ขอบคุณ,


คุณควรทำตามเวอร์ชัน Visual Studio 2012 ของบทช่วย
RickAndMSFT

1
ฉันมีปัญหาเดียวกันและปัญหาของฉันได้รับการแก้ไขเมื่อฉันนำ RenderSection ออกจาก @ {} และใช้ @ ไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น
Guilherme Ferreira

1
ลิงก์ใน RickAnd ความคิดเห็นด้านบนใช้ไม่ได้สำหรับฉัน แต่ที่สำคัญกว่านั้นไม่ใช่ปัญหาเกี่ยวกับการสอน แต่เป็นปัญหาการสร้างรหัส VS ที่แก้ไขได้ง่ายและไม่ควรถูกอัดทับโดยการลบบรรทัดที่ล้มเหลวเนื่องจากคำตอบจำนวนมากด้านล่างคำแนะนำที่ยอมรับ ดูคำตอบของฉัน ( stackoverflow.com/a/27152625/165164 ) ด้านล่างสำหรับการอภิปรายว่าเกิดอะไรขึ้น - อย่างน้อยสำหรับ VS. บางเวอร์ชัน
Anne Gunn

ข้อผิดพลาดที่ระบุเกิดขึ้นเมื่อมุมมองได้กำหนดสิ่ง@sectionที่ไม่แสดงผลในเค้าโครง (ด้วยRenderSection) กรณีนี้อาจเกิดขึ้นได้หากคุณอ้างอิงผิดLayoutหรือลืมที่จะอ้างอิงเค้าโครงเลย ดูคำตอบของ @ vonv
StuartLC

คำตอบ:


147

หมายความว่าคุณได้กำหนดส่วนใน Layout.cshtml หลักของคุณแล้ว แต่คุณยังไม่ได้รวมอะไรสำหรับส่วนนั้นไว้ในมุมมองของคุณ

หาก _Layout.cshtml ของคุณมีสิ่งนี้:

@RenderSection("scripts")

จากนั้นเข้าชมทั้งหมดที่ใช้เค้าโครงที่จะต้องรวมถึงการ@sectionที่มีชื่อเดียวกัน (แม้ว่าเนื้อหาของส่วนนี้จะว่างเปล่า):

@{
    ViewBag.Title = "Title";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section scripts{
    // Add something here
}

อีกทางเลือกหนึ่งคือคุณสามารถตั้งค่าจำเป็นเป็นเท็จจากนั้นคุณไม่จำเป็นต้องเพิ่มส่วนในทุกมุมมอง

@RenderSection("scripts", required: false)

หรือคุณยังสามารถห่อ@RenderSectionในifบล็อก

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}

7
คำตอบของคุณมีประโยชน์ ฉันไม่ได้ระบุ @RenderSection ("สคริปต์") ใด ๆ ภายใน _Layout.cshtml แต่ฉันสังเกตเห็นในมุมมองที่สร้างขึ้นโดยอัตโนมัติเมื่อสร้างตัวควบคุมภาพยนตร์ของฉันสำหรับบทช่วยสอนนี้ว่าสิ่งเหล่านั้นมี @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} ดังนั้นฉันจึงลบสิ่งเหล่านั้นในขณะนี้และทุกอย่างก็ใช้ได้ในขณะนี้
Kevin Dark

23
ในขณะที่คำตอบของคุณดี ฉันคิดว่าคุณควรชี้ให้เห็นว่าการเพิ่ม, required: false)การสร้าง@RenderSection("scripts", required: false)จะอนุญาตให้รวมหรือไม่
Eonasdan

3
@ KDark11 เมื่อสร้างมุมมอง VS ถามว่าคุณต้องการอ้างอิงสคริปต์หรือไม่ เพียงแค่ยกเลิกการทำเครื่องหมายนั้น
Eonasdan

1
ฉันเห็นด้วยว่าการใส่@RenderSection("scripts", required: false)_Layout.cshtml ที่สร้างขึ้นเป็นวิธีการแก้ปัญหาที่เหมาะสม (ดูการอภิปรายด้านล่างสำหรับสาเหตุ) ด้วยวิธีนี้คุณสามารถเพิ่มการแก้ไขในไฟล์เดียวไม่ใช่ทั้งหมด - โปรแกรมแก้ไขที่แห้งกว่ามาก
Anne Gunn

@Eonasdan ว้าวสุดยอดมาก! พวกเขาเพิ่มคุณสมบัตินั้นเมื่อใด โปรดอย่าบอกฉัน v1.0: - /
Simon_Weaver

26

นอกจากนี้คุณสามารถเพิ่มบรรทัดต่อไปนี้ใน_Layout.cshtmlหรือ_Layout.Mobile.cshtml:

@RenderSection("scripts", required: false)

25

ผมมีกรณีที่มี 3 ระดับ A'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml แม้ว่าจะทำเช่นนี้:

_MainLayout.cshtml

<head>
   @RenderSection("head", false)
</head>

_Middle.cshtml

@section head {
    @RenderSection("head")
}

และในการกำหนดPage.cshtml

@section head {
   ***content***
}

ฉันยังคงได้รับข้อผิดพลาด

มีการกำหนดส่วนต่อไปนี้ แต่ยังไม่ได้แสดงผลสำหรับหน้าเค้าโครง“ ~ / Views / Shared / _Middle.cshtml”: "head"

ปรากฎว่าข้อผิดพลาดเกิดจากMiddle.cshtmlต้องอาศัย/Views/_ViewStart.cshtml เพื่อแก้ไขเลย์เอาต์หลัก ปัญหาได้รับการแก้ไขโดยกำหนดสิ่งนี้ใน Middle.cshtmlอย่างชัดเจน:

@{
Layout = "~/Views/_Shared/_MainLayout.cshtml";
}

ไม่สามารถตัดสินใจได้ว่านี่จะเป็นผลจากการออกแบบหรือข้อบกพร่องใน MVC 4 - อย่างไรก็ตามปัญหาได้รับการแก้ไขแล้ว :)


ฉันมีปัญหาเดียวกัน ประเด็นคือฉันกำลังเรียกใช้ RenderSection ก่อน RenderBody และภายใน Body Content ฉันกำลังกำหนดส่วน มันอาจจะเป็น?
Guilherme Ferreira

1
วันนี้ฉันได้เรียนรู้วิธีการทำ "เค้าโครงกลาง" ด้วยตัวอย่างโค้ดที่นี่ @section Foo {@RenderSection("Foo")}เพื่อ "ส่งต่อ" ส่วนต่างๆ! @RenderBody()นอกจากนี้ยังมีการส่งต่อร่างกายด้วย
starlocke

ฉลาดมาก :)))
ehsan

11

ฉันไม่แน่ใจว่าเหตุใดจึงยอมรับคำตอบที่ได้รับการยอมรับหากวิธีแก้ไขปัญหาที่แนะนำไม่ได้และไม่สามารถแก้ปัญหาได้ จริงๆแล้วอาจมีปัญหาที่เกี่ยวข้องสองประเด็นที่เกี่ยวข้องกับหัวข้อนี้

ฉบับที่ 1

หน้าต้นแบบ (เช่น_Layout.cshtml) มีการกำหนดส่วนและจำเป็นแต่มุมมองที่สืบทอดไม่ได้นำไปใช้ ตัวอย่างเช่น,

เทมเพลตเค้าโครง

<body>
    @* Visible only to admin users *@
    <div id="option_box"> 
        @* this section is required due to the absence of the second parameter *@
        @RenderSection("OptionBox") 
    </div>
</body>

มุมมองการสืบทอด

ไม่จำเป็นต้องแสดงรหัสใด ๆ เพียงแค่พิจารณาว่าไม่มีการใช้งาน@section OptionBox {}บนมุมมอง

ข้อผิดพลาดสำหรับปัญหา # 1

Section not defined: "OptionBox ".

ฉบับที่ 2

หน้าต้นแบบ (เช่น_Layout.cshtml) มีการกำหนดส่วนและจำเป็นและมุมมองที่สืบทอดได้นำไปใช้ อย่างไรก็ตามมุมมองการนำไปใช้งานมีscriptส่วนเพิ่มเติมที่ไม่ได้กำหนดไว้ใน (ใด ๆ ) หน้าต้นแบบ

เทมเพลตเค้าโครง

same as above

มุมมองการสืบทอด

<div>
  <p>Looks like the Lakers can still make it to the playoffs</p>
</div>
@section OptionBox {
<a href"">Go and reserve playoff tickets now</a>
}
@section StatsBox {
<ul>
    <li>1. San Antonio</li>
    <li>8. L. A. Lakers</li>
</ul>
}

ข้อผิดพลาดสำหรับปัญหา # 2

The following sections have been defined but have not been rendered for the layout page "~/Views/Shared/_Layout.cshtml": "StatsBox"

ปัญหาของ OP คล้ายกับปัญหา # 2 และคำตอบที่ยอมรับคือสำหรับปัญหา # 1


3
เห็นด้วยกับความคิดเห็นของ OP คือเขาลบส่วนในมุมมองเพื่อแก้ไขข้อผิดพลาดซึ่งหมายความว่าเขามีส่วนที่กำหนดไว้ในมุมมอง แต่ไม่อยู่ในเค้าโครงไม่ใช่วิธีอื่นเนื่องจากที่อยู่คำตอบส่วนใหญ่ (ฉบับที่ 2 ซึ่งสอดคล้องกับ ข้อผิดพลาดที่อธิบาย) คำตอบอื่น ๆ ทั้งหมดกำลังอธิบายถึงสถานการณ์ที่จะไม่ก่อให้เกิดข้อผิดพลาดนั้น แต่มีการกำหนด "ส่วนที่ไม่ได้กำหนด" แทนที่จะเป็น "ส่วน แต่ ... ไม่แสดงผล"
AaronLS

9

ฉันคิดว่าวิธีแก้ปัญหาของเราแตกต่างจากคนอื่น ๆ พอสมควรดังนั้นฉันจะบันทึกไว้ที่นี่

เรามีการตั้งค่าเค้าโครงหลักเลย์เอาต์ตัวกลางและจากนั้นแสดงผลหน้าการดำเนินการขั้นสุดท้าย Main.cshtml <- Config.cshtml <- Action.cshtml

เฉพาะเมื่อ web.config customErrors='On/RemoteOnly'เราได้รับข้อผิดพลาดที่กำหนดเองและไม่มีข้อยกเว้นหรือApplication_Errorถูกเรียก ฉันสามารถจับสิ่งนี้ได้ทางLayout = nullออนไลน์ใน Error.cshtml ข้อยกเว้นเป็นเหมือนในคำถามส่วนสคริปต์ที่ขาดหายไป

เราได้กำหนดไว้ใน Main.cshtml (ด้วย required: false) และ Action.cshtml ไม่มีสิ่งใดที่เขียนลงในส่วนสคริปต์

วิธีแก้ไขคือเพิ่ม@section scripts { @RenderSection("scripts", false) }ใน Config.cshtml


7

โดยทั่วไปจะเกิดขึ้นเมื่อ_Layout.cshtmlไม่มี:

@RenderSection("scripts", required: false)

หรือด้วย

@RenderSection("scripts")  

โดยไม่ต้อง

required: false

ดังนั้นเพียงแค่เพิ่ม @RenderSection ( "สคริปต์" จำเป็นต้องใช้: เท็จ) ใน_Layout.cshtml และการทำงานเป็นพิเศษสำหรับนักพัฒนาผู้ที่ทำงานร่วมกับKendoui genarated โครงการ


7

ดูเหมือนว่ามีความไม่ตรงกันระหว่างไฟล์ View ที่ Visual Studio บางเวอร์ชันสร้างขึ้นโดยอัตโนมัติให้คุณเมื่อคุณใช้เพื่อสร้าง Model ใหม่ ฉันพบปัญหานี้โดยใช้VS 2013 Community Edition ใหม่และกำลังดำเนินการตามบทช่วยสอน W3Schools ที่http://www.w3schools.com/aspnet/mvc_app.aspแต่ความคิดเห็นด้านบนระบุว่าไม่ใช่ปัญหากับคำแนะนำการสอนหรือด้วย VS. เวอร์ชันเดียว

เป็นความจริงที่คุณสามารถทำให้ข้อความแสดงข้อผิดพลาดหายไปได้โดยเพียงแค่ลบไฟล์

@Scripts.Render("~/bundles/jqueryval")

บรรทัดจากสร้าง / แก้ไขเค้าโครงที่สร้างขึ้นโดยอัตโนมัติโดย Visual Studio

แต่วิธีแก้ปัญหานั้นไม่ได้กล่าวถึงสาเหตุที่แท้จริงหรือปล่อยให้คุณอยู่ในสถานที่ที่ดีที่จะทำมากกว่าการเดินผ่านบทช่วยสอน ในบางจุด (อาจค่อนข้างเร็ว) ในการพัฒนาแอปพลิเคชันจริงคุณจะต้องการเข้าถึงรหัสตรวจสอบ jquery ที่โซลูชันการแสดงความคิดเห็นลบออกจากแอปของคุณ

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

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

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

ข้อผิดพลาดเกิดขึ้นเนื่องจาก VS ไม่ได้เพิ่มบรรทัดที่เกี่ยวข้องลงในไฟล์ _Layout.cshtml ที่แชร์หรือดูคำตอบด้านบนเพิ่ม แต่ให้แสดงความคิดเห็นไว้ บรรทัดนี้คือ

@RenderSection("scripts", required: false)

หากมุมมองบางส่วนของคุณมีส่วนสคริปต์ (เช่นสร้างและแก้ไข) จะต้องมีคำสั่ง RenderSection ฝังอยู่ในเค้าโครง หากบางสคริปต์มีส่วนและบางส่วนไม่มี (เช่น Delete, Details และ Index ไม่มี) คำสั่ง RenderSection จะต้องมีrequired: falseพารามิเตอร์

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

ป.ล. มันเป็นเรื่องเล็กน้อยที่ทำให้สับสนที่นี่สิ่งที่จำเป็นต้องอยู่ใน 'บันเดิล' และคำสั่งที่ต้องการดูเหมือนว่ากำลังพยายามรวมไฟล์ไว้ในโฟลเดอร์บันเดิลที่ไม่มีอยู่ในโปรเจ็กต์ของคุณ แต่สำหรับการดีบักบิวด์และแบบฝึกหัดนั้นไม่เกี่ยวข้องเนื่องจากไฟล์ที่รวมเข้าด้วยกันจะรวมทีละไฟล์ ดู: http://www.asp.net/mvc/overview/performance/bundling-and-minificationรหัสที่เป็นปัญหานี้มีการกล่าวถึงสั้น ๆ เกี่ยวกับสองในสามของวิธีลงหน้า


"โขดหิน" นี้และเป็นคำอธิบายที่ดีจริงๆ บางทีมันอาจจะเข้ามาทีหลังก็เลยไม่ได้รับการโหวตมากมาย ....
JosephDoggie

2

ขณะทำงานผ่าน ASP.NET MVC 4 Tutorial กับ Visual Studio 2012 ฉันพบข้อผิดพลาดเดียวกันในส่วน "การเข้าถึงข้อมูลของโมเดลของคุณจากคอนโทรลเลอร์" การแก้ไขค่อนข้างง่าย

เมื่อสร้างแอปพลิเคชันเว็บ ASP.NET MVC 4 ใหม่ใน Visual Studio 2012 ภายในเอกสาร _Layout.cshtml ในโฟลเดอร์ที่ใช้ร่วมกันส่วน "สคริปต์" จะแสดงความคิดเห็น

    @*@RenderSection("scripts", required: false)*@

เพียงแค่ยกเลิกการแสดงความคิดเห็นในบรรทัดและโค้ดตัวอย่างก็ควรใช้งานได้

    @RenderSection("scripts", required: false)

1

ฉันมีปัญหาเดียวกันขณะใช้การสอนสำหรับผู้เริ่มต้น MVC ฉันได้รับคำแนะนำมากมายในการแก้ไข @RenderSection ในไฟล์ layout.cshtml ของคุณ แต่ฉันไม่ได้ใช้มัน

ฉันค้นหามามากแล้วฉันพบว่าแท็กสคริปต์ที่สร้างขึ้นใน (View / Edit.cshtml) และไฟล์ cshtml อื่น ๆ ไม่แสดงผล

**@section Scripts {
@Scripts.Render("~/bundles/jqueryval")

} **

ดังนั้นฉันจึงลบบรรทัดเหล่านั้นออกและแอปพลิเคชันเริ่มทำงานได้อย่างราบรื่น


1

ฉันรู้สึกว่าคุณกำลังเรนเดอร์ส่วนของคุณจากภายใน @section ในไฟล์ _Layout ที่อ้างถึงมุมมองบางส่วนด้วย @section นั่นคือคุณได้ซ้อน @section ไว้ใน @section ในไฟล์ _Layout ให้ลบ @section รอบจุดตัดใหม่



0

ฉันค้นหาข้อผิดพลาดในเว็บและมาที่หน้านี้ ฉันใช้ Visual Studio 2015 และนี่เป็นโครงการ MVC แรกของฉัน

หากคุณพลาดสัญลักษณ์ @ ก่อนส่วนการแสดงผลคุณจะได้รับข้อผิดพลาดเดียวกัน ฉันต้องการแบ่งปันสิ่งนี้สำหรับผู้เริ่มต้นในอนาคต

 @RenderSection("headscripts", required: false)


0

สำหรับฉันปัญหาอยู่ใน _Layout.cshtml ของฉันฉันมี RenderSection อยู่ในเงื่อนไข

 @if (theme == "Red" || theme == "Green")
  {
       <div>
       @RenderSection("Footer", false)
       </div>
   }

และในมุมมองลูกของฉันมันไม่มีเงื่อนไข

@section Footer{
        <div>
            @Html.AwButton("Reject", "Reject")
            @Html.AwSubmit("Ok", "Ok")
        </div>
    }

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


-1

ตรวจสอบการสะกดคำและตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กของคำว่า ""

เมื่อใดก็ตามที่เราเขียน @RenderSection ("name", required: false) ตรวจสอบให้แน่ใจว่ามุมมองมีดโกนมีชื่อ section @section {} ดังนั้นให้ตรวจสอบการสะกดและตัวพิมพ์ใหญ่ / ตัวเล็กของคำว่า "" ถูกต้องในกรณีนี้คือ "สคริปต์"


-1

โปรดตรวจสอบว่าคุณได้พิมพ์การสะกดที่ถูกต้องของการใช้ส่วนสคริปต์ในมุมมอง

ที่ถูกต้องคือ

@section scripts{ //your script here}

ถ้าคุณพิมพ์@section script{ //your script here}ผิด

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