Die folgenden Abschnitte wurden definiert, aber nicht für die Layoutseite "~ / Views / Shared / _Layout.cshtml" gerendert: "Scripts"

100

Ich bin neu in ASP MVC und verwende das Beta-Tutorial zur Einführung in ASP MVC 4 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

Ich stoße auf einen Fehler, auf den ich anscheinend keine Antwort finde, und ich habe auch nicht viel Programmiererfahrung. Daher weiß ich nicht, wo ich anfangen soll, dies zu beheben, um mit dem Tutorial fortzufahren. Ich freue mich über jede Hilfe, die Sie leisten können.

Ich bin im Abschnitt Zugriff auf die Daten Ihres Modells von einem Controller aus und erhalte diesen Fehler, wenn ich versuche, einen Film als Teil des Tutorials zu erstellen. Ich klicke auf den Link "Neu erstellen" und erhalte die folgende Fehlermeldung

Die folgenden Abschnitte wurden definiert, aber nicht für die Layoutseite> "~ / Views / Shared / _Layout.cshtml" gerendert: "Scripts"

Anstatt Visual Studio Express zu verwenden, habe ich mich für das Herunterladen von Visual Studio 2012 RC entschieden (nicht sicher, ob dies die Hauptursache für mein Problem ist.

Mir ist klar, dass ich möglicherweise Code einfügen muss, um dies zu beantworten, aber ich bin mir nicht sicher, welchen Code ich überhaupt einschließen soll. Bitte geben Sie an, welchen Code ich gegebenenfalls einfügen muss, und ich werde ihn gerne zu meiner Frage hinzufügen.

Danke dir,

Kevin Dark
quelle
Sie sollten die Visual Studio 2012-Version dieses Tutorials asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT
1
Ich hatte das gleiche Problem und mein Problem wurde gelöst, als ich RenderSection aus @ {} herausnahm und nur @ verwendete. Keine Ahnung, warum das passiert
Guilherme Ferreira
1
Link in RickAnd Kommentar oben funktioniert bei mir nicht. Noch wichtiger ist jedoch, dass es sich nicht um ein Tutorial-Problem handelt, sondern um ein Problem bei der VS-Codegenerierung, das leicht behoben werden kann und nicht nur durch Entfernen der fehlerhaften Zeile behoben werden sollte, da viele Antworten unter der akzeptierten vorschlagen. In meiner Antwort ( stackoverflow.com/a/27152625/165164 ) unten finden Sie eine Diskussion darüber, was wirklich vor sich geht - zumindest für einige Versionen von VS.
Anne Gunn
Der angegebene Fehler wird erzeugt, wenn eine Ansicht eine definiert hat, @sectiondie NICHT im Layout (mit RenderSection) gerendert wird . Dies kann auftreten, wenn Sie auf das Falsche verwiesen haben Layoutoder vergessen haben, überhaupt auf ein Layout zu verweisen. Siehe @ vonvs Antwort
StuartLC

Antworten:

142

Dies bedeutet, dass Sie einen Abschnitt in Ihrer Master-Layout.cshtml definiert haben, aber nichts für diesen Abschnitt in Ihre Ansicht aufgenommen haben.

Wenn Ihre _Layout.cshtml so etwas hat:

@RenderSection("scripts")

Dann müssen alle Ansichten, die dieses Layout verwenden, eine @sectionmit demselben Namen enthalten (auch wenn der Inhalt des Abschnitts leer ist):

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

Alternativ können Sie erforderlich auf false setzen, dann müssen Sie den Abschnitt nicht in jeder Ansicht hinzufügen.

@RenderSection("scripts", required: false)

oder Sie können das auch @RenderSectionin einen ifBlock einwickeln ,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
mgnoonan
quelle
7
Ihre Antwort war hilfreich. Ich habe in der _Layout.cshtml keinen @RenderSection ("Scripts") identifiziert, aber in den Ansichten, die beim Erstellen meines Movies Controllers für dieses Tutorial automatisch erstellt wurden, festgestellt, dass diese @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Also habe ich diese vorerst gelöscht und alles funktioniert jetzt.
Kevin Dark
23
während deine Antwort gut ist. Ich denke, Sie sollten darauf hinweisen, dass das Hinzufügen von , required: false)Making es @RenderSection("scripts", required: false)ermöglicht, es aufzunehmen oder nicht.
Eonasdan
3
@ KDark11 Beim Erstellen einer Ansicht fragt VS, ob Sie auf die Skripte verweisen möchten. Deaktivieren Sie das einfach.
Eonasdan
1
Ich stimme zu, dass @RenderSection("scripts", required: false)das Einfügen in die generierte _Layout.cshtml die richtige Lösung ist. (Siehe Diskussion unten, warum.) Auf diese Weise können Sie den Fix in einer Datei hinzufügen, nicht in allen - einem viel trockeneren Fix.
Anne Gunn
@Eonasdan wow das ist super! Wann haben sie diese Funktion hinzugefügt? Bitte sag mir nicht v1.0: - /
Simon_Weaver
25

Sie können dem _Layout.cshtmloder auch die folgende Zeile hinzufügen _Layout.Mobile.cshtml:

@RenderSection("scripts", required: false)
Juan Carlos Puerto
quelle
24

Ich hatte einen Fall mit 3 Ebenen a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Auch wenn ich das so mache:

_MainLayout.cshtml

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

_Middle.cshtml

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

und in Page.cshtml definieren

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

Ich würde immer noch den Fehler bekommen

Die folgenden Abschnitte wurden definiert, aber nicht für die Layoutseite "~ / Views / Shared / _Middle.cshtml" gerendert: "head".

Es stellte sich heraus, dass der Fehler darin bestand, dass Middle.cshtml sich auf /Views/_ViewStart.cshtml stützte , um das übergeordnete Layout aufzulösen. Das Problem wurde behoben, indem dies in Middle.cshtml explizit definiert wurde:

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

Ich kann mich nicht entscheiden, ob dies beabsichtigt oder ein Fehler in MVC 4 ist - das Problem wurde sowieso gelöst :)

Frederik Struck-Schøning
quelle
Ich habe das gleiche Problem. Der Punkt ist, dass ich RenderSection vor RenderBody aufrufe und innerhalb von Body Content den Abschnitt definiere. Könnte es sein?
Guilherme Ferreira
Heute habe ich dank eines Codebeispiels hier gelernt, wie man ein "mittleres Layout" macht. @section Foo {@RenderSection("Foo")}die Abschnitte "weitergeben"! Musste auch den Körper mit weitergeben @RenderBody().
Starlocke
11

Ich bin nicht sicher, warum die akzeptierte Antwort akzeptiert wurde, wenn die vorgeschlagene Lösung das Problem nicht gelöst hat und nicht löst. Es kann tatsächlich zwei verwandte Probleme geben, die mit diesem Thema zusammenhängen.

Fehler 1

Auf der Masterseite (z. B. _Layout.cshtml) ist ein Abschnitt definiert, der erforderlich ist , von den geerbten Ansichten jedoch nicht implementiert wurde. Beispielsweise,

Die Layoutvorlage

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

Die ererbende Ansicht

Sie müssen keinen Code anzeigen. Beachten Sie jedoch, dass die Ansicht nicht implementiert ist @section OptionBox {}.

Der Fehler für Problem Nr. 1

Section not defined: "OptionBox ".

Problem Nr. 2

Auf der Masterseite (z. B. _Layout.cshtml) ist ein Abschnitt definiert erforderlich , UND die erbende Ansicht hat ihn implementiert. Die Implementierungsansicht enthält jedoch zusätzliche scriptAbschnitte, die nicht auf (einer) ihrer Masterseiten definiert sind .

Die Layoutvorlage

same as above

Die ererbende Ansicht

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

Der Fehler für Problem Nr. 2

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

Das Problem des OP ähnelt Problem Nr. 2 und die akzeptierte Antwort bezieht sich auf Problem Nr. 1.

von v.
quelle
3
Der Kommentar von OP ist, dass er einen Abschnitt gelöscht hat, um den Fehler zu beheben. Dies bedeutet, dass er einen Abschnitt in einer Ansicht definiert hat, jedoch nicht im Layout, nicht umgekehrt, da die meisten Antworten adressiert sind (Problem Nr. 2, das entspricht) der Fehler, den sie beschreiben) Alle anderen Antworten beschreiben eine Situation, die diesen Fehler nicht hervorrufen würde, sondern "Abschnitt nicht definiert" anstelle von "Abschnitte wurden definiert, aber ... nicht gerendert".
AaronLS
8

Ich denke, unsere Lösung war ausreichend anders als alle anderen, deshalb werde ich sie hier dokumentieren.

Wir haben das Hauptlayout eingerichtet, ein Zwischenlayout und dann das endgültige Rendern der Aktionsseite. Main.cshtml <- Config.cshtml <- Action.cshtml

Erst als web.config customErrors='On/RemoteOnly'einen benutzerdefinierten Fehler hatte und keine Ausnahme noch Application_Erroraufgerufen wurde. Ich könnte das verstehenLayout = null online in der Error.cshtml abfangen. Ausnahme war wie in der Frage, fehlende Skripte Abschnitt.

Wir haben es in Main.cshtml definiert (mit erforderlich: false) und Action.cshtml hatte nichts, was in den Skriptabschnitt geschrieben wurde.

Die Lösung bestand darin @section scripts { @RenderSection("scripts", false) }, Config.cshtml hinzuzufügen .

Pasi Savolainen
quelle
7

Es tritt grundsätzlich auf, wenn _Layout.cshtml ohne ist:

@RenderSection("scripts", required: false)

oder mit

@RenderSection("scripts")  

OHNE

required: false

Fügen Sie einfach @RenderSection ("Skripte", erforderlich: false) in _Layout.cshtml hinzu und es funktioniert speziell für Entwickler, die mit generierten Kendoui-Projekten arbeiten.

JMJ
quelle
7

Es scheint, dass zwischen den Ansichtsdateien, die einige Versionen von Visual Studio automatisch für Sie generieren, wenn Sie damit ein neues Modell erstellen, eine Nichtübereinstimmung besteht. Ich habe dieses Problem mit der neuen VS 2013 Community Edition festgestellt und bin durch das W3Schools-Tutorial unter http://www.w3schools.com/aspnet/mvc_app.asp gegangen obigen Kommentare weisen jedoch darauf hin, dass es kein Problem mit den Anweisungen des Tutorials oder mit a ist Einzelversion von VS.

Es ist wahr , dass Sie die Fehlermeldung machen weggehen die nur durch das Entfernen

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

Zeile aus den Layouts zum Erstellen / Bearbeiten, die von Visual Studio automatisch generiert wurden.

Diese Lösung behebt jedoch nicht die Grundursache und lässt Sie nicht an einem guten Ort zurück, um mehr zu tun, als das Tutorial zu Ende zu gehen. Irgendwann (wahrscheinlich ziemlich früh) in der Entwicklung einer echten Anwendung möchten Sie Zugriff auf den JQuery-Validierungscode, den die auskommentierende Lösung aus Ihrer App entfernt.

Wenn Sie mit VS ein neues Modell für Sie erstellen, werden außerdem fünf Ansichtsdateien erstellt: Erstellen, Löschen, Details, Bearbeiten und Indexieren. Mit zwei dieser Ansichten, Erstellen und Bearbeiten, kann der Benutzer Daten für die Felder in Datenbankeinträgen hinzufügen / bearbeiten, die dem Modell zugrunde liegen. Für diese Ansichten in einer realen App möchten Sie wahrscheinlich eine gewisse Datenüberprüfung mithilfe der jquery-Überprüfungsbibliothek durchführen, bevor Sie den Datensatz in der Datenbank speichern. Aus diesem Grund fügt VS die folgenden Zeilen hinzu

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

auf den Grund dieser beiden Ansichten und nicht andere. Der automatisch generierte Code versucht, die Validierungsbibliothek für diese Ansichten verfügbar zu machen, nicht jedoch für die anderen.

Der Fehler tritt auf, weil VS der freigegebenen Datei _Layout.cshtml entweder keine entsprechende Zeile hinzufügt oder, siehe eine Antwort oben, diese hinzufügt, sie jedoch auskommentiert. Diese Zeile ist

@RenderSection("scripts", required: false)

Wenn einige Ihrer Ansichten einen Skriptabschnitt enthalten (wie beim Erstellen und Bearbeiten), muss ein RenderSection-Befehl in das Layout eingebettet sein. Wenn einige Skripte den Abschnitt haben und andere nicht (wie Löschen, Details und Index nicht), muss der Befehl RenderSection den required: falseParameter haben.

Die beste Lösung, wenn Sie mehr als nur das Tutorial beenden möchten, besteht darin, die Anweisung zu _Layout.cshtml hinzuzufügen und den Code nicht aus den Ansichten Bearbeiten und Erstellen zu entfernen.

PS: Es ist ein bisschen verwirrend, dass sich das, was benötigt wird, in einem 'Bundle' befindet und die require-Anweisung so aussieht, als würde versucht, eine Datei in einen Bundles-Ordner aufzunehmen, der in Ihrem Projekt nicht vorhanden ist. Für Debug-Builds und Tutorials ist dies jedoch nicht relevant, da die gebündelten Dateien einzeln enthalten sind. Siehe: http://www.asp.net/mvc/overview/performance/bundling-and-minification Der hier in Rede stehende Code wird kurz auf etwa zwei Dritteln der Seite erwähnt.

Anne Gunn
quelle
Dies "rockt" und ist eine wirklich gute Erklärung. Vielleicht kam es später und bekam nicht viele Stimmen ...
JosephDoggie
2

Beim Durcharbeiten des ASP.NET MVC 4-Lernprogramms mit Visual Studio 2012 ist derselbe Fehler im Abschnitt "Zugreifen auf die Daten Ihres Modells von einem Controller aus" aufgetreten. Das Update ist ganz einfach.

Beim Erstellen einer neuen ASP.NET MVC 4-Webanwendung in Visual Studio 2012 im Dokument _Layout.cshtml im freigegebenen Ordner wird der Abschnitt "Skripte" auskommentiert.

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

Kommentieren Sie einfach die Zeile aus und der Beispielcode sollte funktionieren.

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

Ich habe das gleiche Problem bei der Implementierung eines Tutorials für MVC-Anfänger. Ich habe verschiedene Vorschläge erhalten, um den @RenderSection in Ihrer Datei layout.cshtml zu ändern, aber ich habe ihn nicht verwendet.

Ich habe viel gesucht und dann festgestellt, dass das in einer (View / Edit.cshtml) und einer anderen cshtml-Datei generierte Skript-Tag nicht gerendert wird

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

} **

Also habe ich diese Zeilen entfernt und die Anwendung läuft reibungslos.

Tejas Sawant
quelle
1

Ich habe auch ** @ section Scripts kommentiert, da es reibungslos läuft. :) :)

Pallavi
quelle
Vielen Dank. Es hat geholfen :)
noobprogrammer
0

Ich habe im Web nach dem Fehler gesucht und bin auf diese Seite gekommen. Ich verwende Visual Studio 2015 und dies ist mein erstes MVC-Projekt.

Wenn Sie das @ -Symbol vor dem Renderabschnitt verpassen, wird der gleiche Fehler angezeigt. Ich möchte dies für zukünftige Anfänger teilen.

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

Ich habe das Gefühl, dass Sie Ihren Abschnitt aus einem @ Abschnitt in der _Layout-Datei rendern, der auf eine Teilansicht mit einem @ Abschnitt verweist, dh Sie haben einen @ Abschnitt in einem @ Abschnitt verschachtelt. Entfernen Sie in der _Layout-Datei den @ -Abschnitt um den Renderabschnitt.

Andrei Magasiner
quelle
0

Ich habe dieses Problem folgendermaßen gelöst:

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

Für mich war das Problem in meiner _Layout.cshtml Ich habe RenderSection in einer Bedingung

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

und aus meiner kindlichen Sicht war es bedingungslos

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

Unabhängig vom Thema fügte das Kind die Fußzeile hinzu. Aber im übergeordneten Element, wenn das Thema nicht rot oder grün ist, wurde die Fußzeile nicht hinzugefügt, und es wurde eine nicht übergebene Ausnahme ausgelöst.

Jaydeep Shil
quelle
-1

Überprüfen Sie die Schreibweise und den Groß- / Kleinbuchstaben des Ausdrucks ""

Wenn wir @RenderSection schreiben ("Name", erforderlich: false), stellen Sie sicher, dass die Rasiereransicht einen Abschnitt @Section name {} enthält. Überprüfen Sie daher die Schreibweise und den Groß- / Kleinbuchstaben des Begriffs "". In diesem Fall ist "Scripts" korrekt.

Subhasis
quelle
-1

Bitte stellen Sie sicher, dass Sie die korrekte Schreibweise für die Verwendung des Skriptabschnitts in der Ansicht eingegeben haben

das richtige ist

@section scripts{ //your script here}

Wenn Sie eingegeben @section script{ //your script here}haben, ist dies falsch.

Petter Friberg
quelle