Bagian berikut telah ditentukan tetapi belum dirender untuk halaman tata letak "~ / Views / Shared / _Layout.cshtml": "Scripts"

101

Saya baru mengenal ASP MVC dan menggunakan tutorial Pengantar ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

Saya mengalami kesalahan yang sepertinya tidak dapat saya temukan jawabannya dan saya juga tidak memiliki banyak pengalaman pemrograman sehingga saya tidak tahu harus mulai dari mana untuk memperbaikinya dan melanjutkan dengan tutorial. Saya menghargai bantuan apa pun yang dapat Anda berikan.

Saya di bagian Mengakses Data Model Anda dari Pengontrol dan saya mendapatkan kesalahan ini ketika saya mencoba membuat Film sebagai bagian dari tutorial, saya mengklik tautan "Buat Baru" dan saya mendapatkan kesalahan berikut

Bagian berikut telah ditentukan tetapi belum dirender untuk halaman tata letak> "~ / Views / Shared / _Layout.cshtml": "Scripts"

Daripada menggunakan Visual Studio express, saya memilih untuk mengunduh Visual Studio 2012 RC (tidak yakin apakah itu akan menjadi penyebab utama masalah saya.

Saya menyadari Anda mungkin meminta saya untuk memasukkan kode untuk menjawab ini tetapi saya tidak yakin kode apa yang harus disertakan. Mohon beri tahu kode apa yang Anda ingin saya sertakan jika ada dan saya akan dengan senang hati menambahkannya ke pertanyaan saya.

Terima kasih,

Kevin Dark
sumber
Anda harus mengikuti versi Visual Studio 2012 dari tutorial itu asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT
1
saya memiliki masalah yang sama dan masalah saya terselesaikan saat saya mengambil RenderSection dari @ {} dan hanya menggunakan @. Tidak tahu mengapa ini terjadi
Guilherme Ferreira
1
Link di RickAnd komentar di atas tidak bekerja untuk saya. Tetapi yang lebih penting, ini bukan masalah tutorial, ini adalah masalah pembuatan kode VS yang mudah diperbaiki dan tidak boleh hanya ditutup-tutupi dengan menghapus baris yang gagal seperti yang disarankan oleh banyak jawaban di bawah yang diterima. Lihat jawaban saya ( stackoverflow.com/a/27152625/165164 ) di bawah untuk diskusi tentang apa yang sebenarnya terjadi - setidaknya untuk beberapa versi VS.
Anne Gunn
Kesalahan yang dinyatakan dihasilkan ketika tampilan telah mendefinisikan @sectionyang TIDAK dirender dalam Tata Letak (dengan RenderSection). Ini bisa terjadi jika Anda salah mereferensikan Layout, atau lupa mereferensikan tata letak sama sekali. Lihat jawaban @ vonv
StuartLC

Jawaban:

144

Ini berarti bahwa Anda telah menentukan bagian dalam Layout.cshtml master Anda, tetapi Anda belum menyertakan apa pun untuk bagian itu dalam Tampilan Anda.

Jika _Layout.cshtml Anda memiliki sesuatu seperti ini:

@RenderSection("scripts")

Kemudian semua Tampilan yang menggunakan Layout itu harus menyertakan a @sectiondengan nama yang sama (meskipun konten bagian kosong):

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

Sebagai alternatif, Anda dapat menyetel wajib menjadi salah, lalu Anda tidak perlu menambahkan bagian di setiap Tampilan,

@RenderSection("scripts", required: false)

atau juga Anda bisa membungkusnya @RenderSectiondalam satu ifblok,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
mgnoonan.dll
sumber
7
Jawaban Anda sangat membantu. Saya tidak mengidentifikasi @RenderSection ("Scripts") apa pun dalam _Layout.cshtml tetapi saya memperhatikan dalam tampilan yang dibuat secara otomatis saat membuat pengontrol Film saya untuk tutorial ini, yang memiliki @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Jadi saya menghapusnya untuk saat ini dan semuanya berfungsi untuk saat ini.
Kevin Dark
23
sedangkan jawabanmu bagus. Saya pikir Anda harus menunjukkan bahwa menambahkan , required: false)membuatnya @RenderSection("scripts", required: false)akan memungkinkan untuk dimasukkan atau tidak.
Eonasdan
3
@ KDark11 Saat membuat tampilan VS bertanya apakah Anda ingin mereferensikan skrip. Hapus centang itu.
Eonasdan
1
Saya setuju bahwa memasukkan @RenderSection("scripts", required: false)ke dalam _Layout.cshtml yang dihasilkan adalah solusi yang tepat. (Lihat pembahasan di bawah untuk mengetahui alasannya.) Dengan begitu, Anda dapat menambahkan perbaikan dalam satu file, tidak semua - perbaikan yang jauh lebih KERING.
Anne Gunn
@Eonasdan wow itu luar biasa! kapan mereka menambahkan fitur itu? tolong jangan beri tahu saya v1.0: - /
Simon_Weaver
25

Selain itu, Anda dapat menambahkan baris berikut ke _Layout.cshtmlatau _Layout.Mobile.cshtml:

@RenderSection("scripts", required: false)
Juan Carlos Puerto
sumber
25

Saya punya kasus dengan 3 level a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Meski melakukan seperti ini:

_MainLayout.cshtml

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

_Middle.cshtml

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

dan dalam definisi Page.cshtml

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

Saya masih mendapatkan kesalahan

Bagian berikut telah ditentukan tetapi belum dirender untuk halaman tata letak “~ / Views / Shared / _Middle.cshtml”: "head".

Ternyata, kesalahannya adalah Middle.cshtml mengandalkan /Views/_ViewStart.cshtml untuk menyelesaikan tata letak induknya. Masalahnya diselesaikan dengan mendefinisikan ini di Middle.cshtml secara eksplisit:

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

Tidak dapat memutuskan apakah ini akan disengaja atau bug di MVC 4 - bagaimanapun, masalah telah terpecahkan :)

Frederik Struck-Schøning
sumber
Saya mengalami masalah yang sama. Intinya adalah saya memanggil RenderSection sebelum RenderBody dan di dalam Body Content saya mendefinisikan bagian tersebut. Mungkinkah?
Guilherme Ferreira
1
Hari ini saya belajar bagaimana melakukan "tata letak tengah" berkat contoh kode di sini. @section Foo {@RenderSection("Foo")}untuk "meneruskan" bagian itu! Juga harus melewati tubuh dengan @RenderBody().
starlocke
sangat pintar :)))
ehsan
11

Saya tidak yakin mengapa jawaban yang diterima diterima jika solusi yang disarankan tidak dan tidak menyelesaikan masalah. Sebenarnya ada dua masalah terkait yang terkait dengan topik ini.

Masalah 1

Halaman master (mis. _Layout.cshtml) Memiliki bagian yang ditentukan dan diperlukan, tetapi tampilan yang diwariskan tidak menerapkannya. Sebagai contoh,

Template Tata Letak

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

Pandangan Mewarisi

Tidak perlu menampilkan kode apa pun, cukup pertimbangkan bahwa tidak ada implementasi @section OptionBox {}pada tampilan.

Kesalahan untuk Masalah # 1

Section not defined: "OptionBox ".

Masalah # 2

Halaman master (misalnya _Layout.cshtml) memiliki bagian yang ditentukan dan diperlukan DAN tampilan yang diwariskan benar-benar menerapkannya. Namun, tampilan implementasi memiliki scriptbagian tambahan yang tidak ditentukan pada (salah satu) halaman masternya.

Template Tata Letak

same as above

Pandangan Mewarisi

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

Kesalahan untuk Masalah # 2

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

Masalah OP mirip dengan Masalah # 2 dan jawaban yang diterima adalah untuk Masalah # 1.

von v.
sumber
3
Setuju, komentar OP adalah dia menghapus bagian dalam tampilan untuk mengatasi kesalahan, yang berarti dia memiliki bagian yang ditentukan dalam tampilan, tetapi tidak dalam tata letak, bukan sebaliknya karena sebagian besar alamat jawaban (Masalah # 2 yang sesuai dengan kesalahan yang mereka gambarkan) Semua jawaban lainnya menjelaskan situasi yang tidak akan menghasilkan kesalahan itu, melainkan "Bagian tidak ditentukan" daripada "bagian telah ditentukan tetapi ... tidak diberikan".
AaronLS
8

Saya pikir solusi kami cukup berbeda dari orang lain jadi saya akan mendokumentasikannya di sini.

Kami telah menyiapkan tata letak Utama, tata letak perantara, dan kemudian merender halaman tindakan akhir. Main.cshtml <- Config.cshtml <- Action.cshtml

Hanya ketika web.config memiliki customErrors='On/RemoteOnly'kami mendapat kesalahan khusus dan tidak terkecuali atau Application_Errordipanggil. Saya bisa menangkap ini secara Layout = nullonline di Error.cshtml. Pengecualian seperti dalam pertanyaan, bagian skrip hilang.

Kami telah menetapkannya di Main.cshtml (dengan diperlukan: false) dan Action.cshtml tidak memiliki apa pun yang ditulis ke bagian skrip.

Solusi adalah menambahkan @section scripts { @RenderSection("scripts", false) }Config.cshtml.

Pasi Savolainen
sumber
7

Ini terjadi pada dasarnya ketika _Layout.cshtml tanpa:

@RenderSection("scripts", required: false)

atau dengan

@RenderSection("scripts")  

TANPA

required: false

Jadi, Cukup tambahkan @RenderSection ("scripts", required: false) di _Layout.cshtml dan berfungsi khusus untuk developer yang bekerja dengan proyek genarasi Kendoui .

JMJ
sumber
7

Tampaknya ada ketidakcocokan antara file Tampilan yang dibuat secara otomatis oleh beberapa versi Visual Studio untuk Anda saat Anda menggunakannya untuk membuat Model baru. Saya mengalami masalah ini menggunakan VS 2013 Community Edition baru dan berjalan melalui tutorial W3Schools di http://www.w3schools.com/aspnet/mvc_app.asp tetapi komentar di atas menunjukkan bahwa itu bukan masalah dengan petunjuk tutorial atau dengan versi tunggal VS.

Memang benar bahwa Anda dapat membuat pesan kesalahan pergi dengan hanya menghapus

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

baris dari tata letak buat / edit yang dibuat secara otomatis oleh Visual Studio.

Tetapi solusi itu tidak mengatasi akar masalah atau membuat Anda berada di tempat yang baik untuk melakukan lebih dari sekadar menyelesaikan tutorial. Pada titik tertentu (mungkin cukup awal) dalam pengembangan aplikasi nyata, Anda akan menginginkan akses ke kode validasi jquery yang dihapus oleh solusi komentar dari aplikasi Anda.

Jika Anda menggunakan VS untuk membuat model baru untuk Anda, itu juga membuat satu set lima file View: Buat, Hapus, Detail, Edit, dan Indeks. Dua dari tampilan ini, Buat dan Edit dimaksudkan untuk memungkinkan pengguna menambahkan / mengedit data untuk bidang dalam catatan database yang mendasari model. Untuk tampilan tersebut dalam aplikasi nyata, Anda mungkin ingin melakukan sejumlah validasi data menggunakan pustaka validasi jquery sebelum Anda menyimpan rekaman di db. Itulah mengapa VS menambahkan baris berikut

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

ke bagian bawah dari dua tampilan tersebut dan bukan yang lainnya. Kode yang dibuat secara otomatis mencoba membuat pustaka validasi tersedia untuk tampilan tersebut, tetapi tidak untuk yang lain.

Kesalahan terjadi karena VS tidak menambahkan baris terkait ke file _Layout.cshtml bersama atau, lihat satu jawaban di atas, menambahkannya tetapi membiarkannya dikomentari. Garis ini

@RenderSection("scripts", required: false)

Jika beberapa tampilan Anda memiliki bagian skrip (seperti yang dilakukan Buat dan Edit), harus ada perintah RenderSection yang disematkan di tata letak. Jika beberapa skrip memiliki bagian dan beberapa tidak (seperti Hapus, Detail, dan Indeks tidak), perintah RenderSection harus memiliki required: falseparameter.

Jadi solusi terbaik, jika Anda ingin melakukan sesuatu yang lebih dari sekadar menyelesaikan tutorial, adalah menambahkan pernyataan ke _Layout.cshtml bukan menghapus kode dari tampilan Edit dan Buat.

PS Ini sedikit membingungkan, di sini, bahwa apa yang diperlukan ada dalam 'bundel' dan pernyataan yang dibutuhkan sepertinya mencoba untuk memasukkan file dalam folder bundel yang tidak ada dalam proyek Anda. Namun, untuk build debug dan tutorial, itu tidak relevan karena file yang dibundel disertakan satu per satu. Lihat: http://www.asp.net/mvc/overview/performance/bundling-and-minification Kode yang dipermasalahkan di sini disebutkan secara singkat sekitar dua pertiga di bagian bawah halaman.

Anne Gunn
sumber
Ini "batu" dan merupakan penjelasan yang sangat bagus. Mungkin itu datang kemudian sehingga tidak mendapatkan banyak suara ....
JosephDoggie
2

Saat bekerja melalui Tutorial ASP.NET MVC 4 dengan Visual Studio 2012 saya mengalami kesalahan yang sama di "Mengakses Data Model Anda dari bagian Controller". Cara mengatasinya cukup sederhana.

Saat membuat Aplikasi Web ASP.NET MVC 4 baru di Visual Studio 2012 dalam dokumen _Layout.cshtml di folder bersama, bagian "skrip" diberi komentar.

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

Cukup hapus komentar pada baris tersebut dan kode sampel akan berfungsi.

    @RenderSection("scripts", required: false)
Rick M.
sumber
1

Saya memiliki masalah yang sama saat menerapkan tutorial untuk pemula MVC. Saya mendapat berbagai saran untuk memodifikasi @RenderSection di file layout.cshtml Anda tetapi saya belum menggunakannya.

Saya telah banyak mencari dan kemudian saya menemukan bahwa tag skrip yang dihasilkan di (View / Edit.cshtml) dan file cshtml lainnya tidak dirender

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

} **

Jadi saya menghapus baris tersebut dan aplikasi mulai berjalan dengan lancar.

Tejas Sawant
sumber
1

Saya juga berkomentar ** @ bagian Skrip daripada itu berjalan lancar. :)

Pallavi
sumber
Terima kasih. Ini membantu :)
noobprogrammer
0

Saya mencari kesalahan di web dan membuka halaman ini. Saya menggunakan Visual Studio 2015 dan ini adalah proyek MVC pertama saya.

Jika Anda melewatkan simbol @ sebelum bagian render, Anda akan mendapatkan kesalahan yang sama. Saya ingin membagikan ini untuk pemula yang akan datang.

 @RenderSection("headscripts", required: false)
CodeName47
sumber
0

Saya merasa bahwa Anda merender bagian Anda dari dalam bagian @ di file _Layout yang merujuk ke tampilan parsial dengan bagian @, yaitu Anda telah menumpuk @ bagian dalam bagian @. Di file _Layout, hapus @section di sekitar bagian render.

Andrei Magasiner
sumber
0

Saya memecahkan masalah ini dengan menggunakan yang berikut,

@await Html.PartialAsync("_ValidationScriptsPartial")
Héctor Borrego
sumber
0

Bagi saya masalahnya ada di _Layout.cshtml saya, saya memiliki RenderSection di dalam suatu kondisi

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

dan dalam pandangan anak saya itu tanpa syarat

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

Jadi terlepas dari temanya, anak menambahkan Footer. Tetapi pada induk ketika temanya bukan Merah atau Hijau, itu tidak menambahkan Footer dan pengecualian tanpa tangan dilemparkan.

Jaydeep Shil
sumber
-1

periksa speling dan huruf besar / kecil dari istilah ""

kapan pun kita menulis @RenderSection ("name", required: false) pastikan bahwa tampilan pisau cukur Berisi bagian @ nama bagian {} jadi periksa ejaan dan huruf besar / kecil dari istilah "" Benar dalam hal ini adalah "Skrip"

Subhasis
sumber
-1

Harap pastikan Anda telah mengetik dengan benar ejaan menggunakan bagian script pada tampilan

yang benar adalah

@section scripts{ //your script here}

jika Anda mengetik @section script{ //your script here}ini salah.

Petter Friberg
sumber