Następujące sekcje zostały zdefiniowane, ale nie zostały wyrenderowane dla strony układu „~ / Views / Shared / _Layout.cshtml”: „Scripts”

101

Jestem nowy w ASP MVC i korzystam z samouczka Wprowadzenie do ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

Napotykam błąd, na który nie mogę znaleźć odpowiedzi ani nie mam dużego doświadczenia w programowaniu, więc nie wiem, od czego w ogóle zacząć to naprawiać i przejdź do samouczka. Doceniam każdą pomoc, której możesz udzielić.

Jestem w sekcji Dostęp do danych Twojego modelu z kontrolera i otrzymuję ten błąd, kiedy próbuję stworzyć film jako część samouczka, klikam łącze „Utwórz nowy” i pojawia się następujący błąd

Następujące sekcje zostały zdefiniowane, ale nie zostały wyrenderowane dla strony układu> "~ / Views / Shared / _Layout.cshtml": "Scripts"

Zamiast używać programu Visual Studio Express, zdecydowałem się pobrać program Visual Studio 2012 RC (nie jestem pewien, czy to byłaby główna przyczyna mojego problemu.

Zdaję sobie sprawę, że możesz wymagać dołączenia kodu, aby odpowiedzieć na to pytanie, ale nie jestem pewien, jaki kod w ogóle uwzględnić. Proszę doradzić, jaki kod mam dołączyć, jeśli w ogóle, a ja z przyjemnością dodam go do mojego pytania.

Dziękuję Ci,

Kevin Dark
źródło
Należy postępować zgodnie z wersją tego samouczka dla programu Visual Studio 2012 asp.net/mvc/tutorials/mvc-4/ ...
RickAndMSFT
1
Miałem ten sam problem i mój problem został rozwiązany, gdy wyjęłem RenderSection z @ {} i użyłem tylko @. Nie mam pojęcia, dlaczego tak się dzieje
Guilherme Ferreira
1
Link w RickAnd powyższy komentarz nie działa dla mnie. Ale co ważniejsze, nie jest to problem z samouczkiem, jest to problem z generowaniem kodu VS, który można łatwo naprawić i nie należy go po prostu zaklejać, usuwając wadliwą linię, ponieważ sugeruje wiele odpowiedzi poniżej zaakceptowanej. Zobacz moją odpowiedź ( stackoverflow.com/a/27152625/165164 ) poniżej, aby omówić to, co naprawdę się dzieje - przynajmniej w przypadku niektórych wersji VS.
Anne Gunn
Podany błąd jest generowany, gdy w widoku zdefiniowano element, @sectionktóry NIE jest renderowany w układzie (z RenderSection). Może się tak zdarzyć, jeśli odwołałeś się do niewłaściwego Layoutlub w ogóle zapomniałeś odniesienia do układu. Zobacz odpowiedź @ vonv
StuartLC

Odpowiedzi:

144

Oznacza to, że zdefiniowałeś sekcję w swoim głównym Layout.cshtml, ale nie umieściłeś niczego dla tej sekcji w swoim widoku.

Jeśli twój _Layout.cshtml ma coś takiego:

@RenderSection("scripts")

Następnie wszystkie widoki, które używają tego układu, muszą zawierać @sectiono tej samej nazwie (nawet jeśli zawartość sekcji jest pusta):

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

Alternatywnie możesz ustawić wymagane na false, wtedy nie będziesz musiał dodawać sekcji w każdym widoku,

@RenderSection("scripts", required: false)

lub też możesz zawinąć @RenderSectionw ifblok,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
mgnoonan
źródło
7
Twoja odpowiedź była pomocna. Nie zidentyfikowałem żadnego @RenderSection („Scripts”) w _Layout.cshtml, ale zauważyłem w widokach, które zostały automatycznie utworzone podczas tworzenia mojego kontrolera Movies dla tego samouczka, że ​​mają one @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Więc na razie je usunąłem i na razie wszystko działa.
Kevin Dark
23
podczas gdy twoja odpowiedź jest dobra. Myślę, że powinieneś zwrócić uwagę, że dodanie, , required: false)aby to @RenderSection("scripts", required: false)umożliwić, pozwoli na uwzględnienie lub nie.
Eonasdan
3
@ KDark11 Podczas tworzenia widoku VS pyta, czy chcesz odwołać się do skryptów. Po prostu odznacz to.
Eonasdan
1
Zgadzam się, że umieszczenie @RenderSection("scripts", required: false)w wygenerowanym _Layout.cshtml jest właściwym rozwiązaniem. (Zobacz dyskusję poniżej, aby dowiedzieć się, dlaczego.) W ten sposób można dodać poprawkę w jednym pliku, a nie we wszystkich - jest to znacznie bardziej DRYER.
Anne Gunn
@Eonasdan wow to niesamowite! kiedy dodali tę funkcję? proszę nie mów mi, v1.0: - /
Simon_Weaver
25

Możesz również dodać następujący wiersz do _Layout.cshtmllub _Layout.Mobile.cshtml:

@RenderSection("scripts", required: false)
Juan Carlos Puerto
źródło
25

Miałem przypadek z 3 poziomami a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Nawet jeśli robisz to w ten sposób:

_MainLayout.cshtml

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

_Middle.cshtml

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

i definiowanie w Page.cshtml

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

Nadal otrzymywałbym błąd

Następujące sekcje zostały zdefiniowane, ale nie zostały wyrenderowane dla strony układu „~ / Views / Shared / _Middle.cshtml”: „head”.

Okazało się, że błąd polegał na tym, że Middle.cshtml polegało na /Views/_ViewStart.cshtml w celu rozwiązania swojego układu nadrzędnego. Problem został rozwiązany przez jawne zdefiniowanie tego w Middle.cshtml :

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

Nie mogę się zdecydować, czy to byłby projekt, czy błąd w MVC 4 - w każdym razie problem został rozwiązany :)

Frederik Struck-Schøning
źródło
Mam ten sam problem. Chodzi o to, że wywołuję RenderSection przed RenderBody, a wewnątrz Body Content definiuję sekcję. Mogłoby to być?
Guilherme Ferreira
1
Dziś dowiedziałem się, jak zrobić „środkowy układ” dzięki przykładowemu kodowi tutaj. @section Foo {@RenderSection("Foo")}„przekazać” sekcje! Musiałem też przekazać ciało @RenderBody().
starlocke
bardzo sprytny :)))
ehsan
11

Nie jestem pewien, dlaczego zaakceptowano odpowiedź, skoro sugerowane rozwiązanie nie przyniosło rezultatu i nie rozwiązuje problemu. W rzeczywistości mogą istnieć dwie powiązane kwestie związane z tym tematem.

Problem 1

Strona wzorcowa (np. _Layout.cshtml) Ma zdefiniowaną sekcję i jest wymagana, ale dziedziczące widoki jej nie zaimplementowały. Na przykład,

Szablon układu

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

Dziedziczenie

Nie ma potrzeby pokazywania żadnego kodu, wystarczy wziąć pod uwagę, że w widoku nie ma implementacji @section OptionBox {}.

Błąd dotyczący problemu nr 1

Section not defined: "OptionBox ".

Wydanie nr 2

Na stronie głównej (np _Layout.cshtml) ma przekrój określony i jest wymagane, a widok dziedziczenie nie realizować go. Jednak widok implementujący ma dodatkowe scriptsekcje, które nie są zdefiniowane na żadnej ze stron wzorcowych.

Szablon układu

same as above

Dziedziczenie

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

Błąd dotyczący problemu nr 2

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

Problem PO jest podobny do problemu nr 2, a akceptowana odpowiedź dotyczy problemu nr 1.

von v.
źródło
3
Zgadzam się, OP komentuje, czy usunął sekcję w celu rozwiązania błędu, co oznacza, że ​​miał sekcję zdefiniowaną w widoku, ale nie w układzie, a nie na odwrót, jak większość odpowiedzi (numer 2, który odpowiada błąd, który opisują) Wszystkie inne odpowiedzi opisują sytuację, która nie spowodowałaby tego błędu, ale zamiast tego „sekcja nie została zdefiniowana” zamiast „sekcje zostały zdefiniowane, ale ... nie zostały wyrenderowane”.
AaronLS
8

Myślę, że nasze rozwiązanie wystarczająco różniło się od wszystkich innych, więc udokumentuję je tutaj.

Mamy ustawiony układ główny, układ pośredni, a następnie renderowanie końcowej strony akcji. Main.cshtml <- Config.cshtml <- Action.cshtml

Dopiero gdy web.config customErrors='On/RemoteOnly'otrzymaliśmy niestandardowy błąd i nie Application_Errorzostał wywołany żaden wyjątek . Mogę to przechwycić Layout = nullonline w pliku Error.cshtml. Wyjątkiem był jak w pytaniu, brak sekcji skryptów.

Zrobiliśmy to zdefiniowane w Main.cshtml (z required: false), a Action.cshtml nie zawierało niczego, co zapisano w sekcji skryptów.

Rozwiązaniem było dodanie @section scripts { @RenderSection("scripts", false) }do pliku Config.cshtml.

Pasi Savolainen
źródło
7

Występuje zasadniczo, gdy _Layout.cshtml jest bez:

@RenderSection("scripts", required: false)

lub z

@RenderSection("scripts")  

BEZ

required: false

Więc po prostu dodaj @RenderSection ("skrypty", wymagane: false) w _Layout.cshtml i działa to specjalnie dla tych programistów, którzy pracują z projektami generowanymi przez Kendoui.

JMJ
źródło
7

Wygląda na to, że istnieje niezgodność między plikami widoku, które niektóre wersje programu Visual Studio generują automatycznie, gdy używasz go do tworzenia nowego modelu. Napotkałem ten problem, używając nowej VS 2013 Community Edition i przechodząc przez samouczek W3Schools pod adresem http://www.w3schools.com/aspnet/mvc_app.asp, ale powyższe komentarze wskazują, że nie jest to problem ze wskazówkami samouczka lub pojedyncza wersja VS.

To prawda, że ​​możesz usunąć komunikat o błędzie , po prostu usuwając plik

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

wiersz z układów tworzenia / edycji, które zostały wygenerowane automatycznie przez program Visual Studio.

Ale to rozwiązanie nie rozwiązuje głównej przyczyny ani nie pozostawia w dobrym miejscu do zrobienia czegoś więcej niż ukończenia samouczka. W pewnym momencie (prawdopodobnie dość wcześnie) podczas tworzenia prawdziwej aplikacji będziesz chciał mieć dostęp do kodu walidacji jquery, który rozwiązanie do komentowania usuwa z Twojej aplikacji.

Jeśli używasz VS do tworzenia nowego modelu, tworzy on również zestaw pięciu plików widoku: Utwórz, Usuń, Szczegóły, Edytuj i Indeks. Dwa z tych widoków, Utwórz i Edytuj, mają na celu umożliwienie użytkownikowi dodawania / edytowania danych dla pól w rekordach bazy danych, które stanowią podstawę modelu. W przypadku tych widoków w prawdziwej aplikacji prawdopodobnie będziesz chciał przeprowadzić sprawdzanie poprawności danych za pomocą biblioteki sprawdzania poprawności jquery przed zapisaniem rekordu w bazie danych. Dlatego VS dodaje następujące wiersze

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

na dole tych dwóch poglądów, a nie innych. Automatycznie wygenerowany kod próbuje udostępnić bibliotekę walidacji dla tych widoków, ale nie dla innych.

Błąd występuje, ponieważ VS albo nie dodaje odpowiedniego wiersza do udostępnionego pliku _Layout.cshtml, albo, zobacz odpowiedź powyżej, dodaje go, ale pozostawia zakomentowany. Ta linia jest

@RenderSection("scripts", required: false)

Jeśli niektóre z twoich widoków mają sekcję skryptów (tak jak w przypadku tworzenia i edycji), w układzie musi być osadzone polecenie RenderSection. Jeśli niektóre skrypty mają tę sekcję, a inne nie (jak nie ma opcji Delete, Details i Index), polecenie RenderSection musi mieć required: falseparametr.

Dlatego najlepszym rozwiązaniem, jeśli chcesz zrobić coś więcej niż tylko przejście przez samouczek, jest dodanie instrukcji do _Layout.cshtml, a nie usuwanie kodu z widoków Edytuj i Utwórz.

PS Jest to trochę mylące, że to, co jest wymagane, znajduje się w „pakiecie”, a instrukcja wymagania wygląda tak, jakby próbowała dołączyć plik do folderu bundles, który nie istnieje w twoim projekcie. Jednak w przypadku kompilacji i samouczków do debugowania nie ma to znaczenia, ponieważ dołączone pliki są dołączane pojedynczo. Zobacz: http://www.asp.net/mvc/overview/performance/bundling-and-minification O kodzie, którego dotyczy niniejsza sprawa, wspomniano pokrótce w około dwóch trzecich w dół strony.

Anne Gunn
źródło
To "rządzi" i jest naprawdę dobrym wyjaśnieniem. Być może przyszedł później, więc nie zdobył wielu głosów ...
JosephDoggie
2

Podczas pracy z samouczkiem ASP.NET MVC 4 w programie Visual Studio 2012 napotkałem ten sam błąd w sekcji „Uzyskiwanie dostępu do danych modelu z kontrolera”. Poprawka jest dość prosta.

Podczas tworzenia nowej aplikacji internetowej ASP.NET MVC 4 w programie Visual Studio 2012 w dokumencie _Layout.cshtml w folderze współdzielonym sekcja „scripts” jest komentowana.

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

Po prostu usuń komentarz w wierszu, a przykładowy kod powinien działać.

    @RenderSection("scripts", required: false)
Rick M.
źródło
1

Mam ten sam problem podczas wdrażania samouczka dla początkujących użytkowników MVC. Otrzymałem różne sugestie, aby zmodyfikować @RenderSection w twoim pliku layout.cshtml, ale nie użyłem go.

Dużo szukałem, a potem stwierdziłem, że tag skryptu wygenerowany w (View / Edit.cshtml) i inny plik cshtml nie renderuje się

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

} **

Usunąłem więc te linie i aplikacja zaczęła działać płynnie.

Tejas Sawant
źródło
1

Skomentowałem również ** @ section Scripts, że działa płynnie. :)

Pallavi
źródło
Dzięki. Pomogło :)
noobprogrammer
0

Szukałem błędu w sieci i trafiłem na tę stronę. Używam programu Visual Studio 2015 i jest to mój pierwszy projekt MVC.

Jeśli pominiesz symbol @ przed sekcją renderującą, otrzymasz ten sam błąd. Chciałbym się tym podzielić z przyszłymi początkującymi.

 @RenderSection("headscripts", required: false)
CodeName47
źródło
0

Wydaje mi się, że renderujesz swoją sekcję z sekcji @ w pliku _Layout, który odnosi się do częściowego widoku z sekcją @, tj. Sekcja @ została zagnieżdżona w sekcji @. W pliku _Layout usuń sekcję @ wokół renderowania.

Andrei Magasiner
źródło
0

Rozwiązałem ten problem, używając następujących,

@await Html.PartialAsync("_ValidationScriptsPartial")
Héctor Borrego
źródło
0

Dla mnie problem był w moim _Layout.cshtml Mam RenderSection wewnątrz warunku

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

i moim zdaniem było to bezwarunkowe

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

więc niezależnie od tematu, dziecko dodawało stopkę. Ale w rodzicu, gdy motyw nie jest czerwony ani zielony, nie dodawał stopki ani nie był generowany wyjątek.

Jaydeep Shil
źródło
-1

sprawdź pisownię i wielkie / małe litery terminu „”

kiedy kiedykolwiek piszemy @RenderSection ("name", required: false) upewnij się, że widok maszynki do golenia zawiera sekcję @ nazwę sekcji {}, więc sprawdź pisownię i wielkie / małe litery w tekście "" Prawidłowe w tym przypadku to "Skrypty"

Subhasis
źródło
-1

Upewnij się, że w widoku została wpisana poprawna pisownia sekcji skryptów

prawda jest

@section scripts{ //your script here}

jeśli wpisałeś @section script{ //your script here}to źle.

Petter Friberg
źródło