Le seguenti sezioni sono state definite ma non sono state renderizzate per la pagina di layout "~ / Views / Shared / _Layout.cshtml": "Scripts"


101

Sono nuovo in ASP MVC e utilizzo il tutorial Intro to ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

Sto riscontrando un errore a cui non riesco a trovare una risposta né ho molta esperienza di programmazione, quindi non so nemmeno da dove iniziare per risolvere questo problema e andare avanti con il tutorial. Apprezzo tutto l'aiuto che puoi fornire.

Sono nella sezione Accesso ai dati del modello da un controller e ricevo questo errore quando provo a creare un filmato come parte del tutorial, faccio clic sul collegamento "Crea nuovo" e ricevo il seguente errore

Le seguenti sezioni sono state definite ma non sono state renderizzate per la pagina di layout> "~ / Views / Shared / _Layout.cshtml": "Scripts"

Invece di utilizzare Visual Studio Express, ho scelto di scaricare Visual Studio 2012 RC (non sono sicuro che questa sia la causa principale del mio problema.

Mi rendo conto che potresti richiedermi di includere il codice per rispondere a questo, ma non sono sicuro di quale codice includere. Si prega di avvisare quale codice è necessario che includa se presente e sarò felice di aggiungerlo alla mia domanda.

Grazie,


Dovresti seguire la versione di Visual Studio 2012 di quel tutorial asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT

1
ho avuto lo stesso problema e il mio problema è stato risolto quando ho rimosso RenderSection da @ {} e ho utilizzato solo @. Non ho idea del perché questo accada
Guilherme Ferreira

1
Link in RickE il commento sopra non funziona per me. Ma ancora più importante, questo non è un problema di tutorial, è un problema di generazione di codice VS che può essere facilmente risolto e non dovrebbe essere semplicemente nascosto rimuovendo la riga in errore come suggeriscono molte risposte sotto quella accettata. Vedi la mia risposta ( stackoverflow.com/a/27152625/165164 ) di seguito per una discussione su cosa sta realmente accadendo, almeno per alcune versioni di VS.
Anne Gunn

L'errore dichiarato viene prodotto quando una vista ha definito un @sectionche NON è reso nel Layout (con RenderSection). Ciò può verificarsi se hai fatto riferimento Layouta un layout sbagliato o ti sei dimenticato di fare riferimento a un layout. Vedi la risposta di @ vonv
StuartLC

Risposte:


144

Significa che hai definito una sezione nel tuo Layout.cshtml principale, ma non hai incluso nulla per quella sezione nella tua Vista.

Se il tuo _Layout.cshtml ha qualcosa del genere:

@RenderSection("scripts")

Quindi tutte le viste che utilizzano quel layout devono includere un @sectioncon lo stesso nome (anche se i contenuti della sezione sono vuoti):

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

In alternativa, puoi impostare required su false, quindi non ti verrà richiesto di aggiungere la sezione in ogni vista,

@RenderSection("scripts", required: false)

o puoi anche avvolgere il @RenderSectionin un ifblocco,

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

7
La tua risposta è stata utile. Non ho identificato @RenderSection ("Scripts") all'interno di _Layout.cshtml, ma ho notato nelle visualizzazioni che sono state create automaticamente durante la creazione del mio controller Movies per questo tutorial, che quelle avevano @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Quindi ho cancellato quelli per il momento e tutto funziona per ora.
Kevin Dark,

23
mentre la tua risposta è buona. Penso che dovresti sottolineare che l'aggiunta di , required: false)renderlo @RenderSection("scripts", required: false)consentirà di essere incluso o meno.
Eonasdan,

3
@ KDark11 Quando si crea una vista, VS chiede se si desidera fare riferimento agli script. Basta deselezionarlo.
Eonasdan,

1
@RenderSection("scripts", required: false)Concordo sul fatto che l'inserimento nel _Layout.cshtml generato sia la soluzione giusta. (Vedere la discussione di seguito per il motivo.) In questo modo è possibile aggiungere la correzione in un file, non in tutti: una correzione molto più ASCIUTTA.
Anne Gunn

@Eonasdan wow è fantastico! quando hanno aggiunto quella funzione? per favore non dirmi v1.0: - /
Simon_Weaver

25

Inoltre, puoi aggiungere la seguente riga a _Layout.cshtmlo _Layout.Mobile.cshtml:

@RenderSection("scripts", required: false)

25

Ho avuto un caso con 3 livelli a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Anche se in questo modo:

_MainLayout.cshtml

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

_Middle.cshtml

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

e nella definizione di Page.cshtml

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

Continuerei a ricevere l'errore

Le seguenti sezioni sono state definite ma non sono state renderizzate per la pagina di layout “~ / Views / Shared / _Middle.cshtml”: "head".

Si è scoperto che l'errore era che Middle.cshtml si affidasse a /Views/_ViewStart.cshtml per risolvere il layout principale. Il problema è stato risolto definendolo esplicitamente in Middle.cshtml :

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

Non riesco a decidere se si tratta di un progetto o di un bug in MVC 4 - comunque, il problema è stato risolto :)


Ho lo stesso problema. Il punto è che sto chiamando RenderSection prima di RenderBody e all'interno di Body Content sto definendo la sezione. Potrebbe essere?
Guilherme Ferreira

1
Oggi ho imparato a fare il "layout intermedio" grazie al codice di esempio qui. @section Foo {@RenderSection("Foo")}per "trasmettere" le sezioni! Inoltre ha dovuto trasmettere il corpo con @RenderBody().
starlocke

molto intelligente :)))
ehsan

11

Non sono sicuro del motivo per cui la risposta accettata è stata accettata se la soluzione suggerita non ha funzionato e non risolve il problema. In realtà possono esserci due problemi correlati relativi a questo argomento.

Numero 1

La pagina master (ad esempio _Layout.cshtml) ha una sezione definita ed è richiesta ma le viste ereditate non l'hanno implementata. Per esempio,

Il modello di layout

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

La visione ereditaria

Non è necessario mostrare alcun codice, basta considerare che non è presente alcuna implementazione @section OptionBox {}nella vista.

L'errore per il numero 1

Section not defined: "OptionBox ".

Numero 2

La pagina master (ad esempio _Layout.cshtml) ha una sezione definita ed è richiesta E la vista ereditaria l' ha implementata. Tuttavia, la vista di implementazione ha scriptsezioni aggiuntive che non sono definite in (nessuna delle) sue pagine master.

Il modello di layout

same as above

La visione ereditaria

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

L'errore per il numero 2

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

Il problema dell'OP è simile al problema # 2 e la risposta accettata è per il problema # 1.


3
D'accordo, il commento di OP è che ha cancellato una sezione in vista della risoluzione dell'errore, il che significa che aveva una sezione definita in una vista, ma non nel layout, non viceversa poiché la maggior parte delle risposte affrontano (Problema # 2 che corrisponde a l'errore che descrivono) Tutte le altre risposte descrivono una situazione che non produrrebbe quell'errore, ma invece "Sezione non definita" piuttosto che "sezioni sono state definite ma ... non rese".
AaronLS

8

Penso che la nostra soluzione fosse sufficientemente diversa da tutte le altre, quindi la documenterò qui.

Abbiamo impostato il layout principale, un layout intermedio e quindi il rendering della pagina dell'azione finale. Main.cshtml <- Config.cshtml <- Action.cshtml

Solo quando web.config aveva customErrors='On/RemoteOnly'ricevuto un errore personalizzato e nessuna eccezione né è Application_Errorstata chiamata. Potrei Layout = nulltrovarlo in linea nel Error.cshtml. L'eccezione era come nella domanda, sezione script mancanti.

Lo avevamo definito in Main.cshtml (con required: false) e Action.cshtml non aveva nulla che scrivesse nella sezione degli script.

La soluzione era aggiungere @section scripts { @RenderSection("scripts", false) }a Config.cshtml.


7

Si verifica fondamentalmente quando _Layout.cshtml è senza:

@RenderSection("scripts", required: false)

o con

@RenderSection("scripts")  

SENZA

required: false

Quindi, aggiungi @RenderSection ("scripts", required: false) in _Layout.cshtml e funziona specialmente per quegli sviluppatori che lavorano con i progetti generati da Kendoui.


7

Sembra che ci sia una mancata corrispondenza tra i file di visualizzazione che alcune versioni di Visual Studio generano automaticamente quando lo si utilizza per creare un nuovo modello. Ho riscontrato questo problema utilizzando la nuova VS 2013 Community Edition e seguendo il tutorial W3Schools su http://www.w3schools.com/aspnet/mvc_app.asp ma i commenti sopra indicano che non è un problema con le istruzioni del tutorial o con un versione singola di VS.

E 'vero che si può fare il messaggio di errore andare via semplicemente rimuovendo il

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

riga dai layout di creazione / modifica che sono stati generati automaticamente da Visual Studio.

Ma quella soluzione non affronta la causa principale né ti lascia in una buona posizione per fare di più che finire di camminare attraverso il tutorial. Ad un certo punto (probabilmente abbastanza presto) nello sviluppo di un'applicazione reale, vorrai accedere al codice di convalida jquery che la soluzione di commento rimuove dalla tua app.

Se utilizzi VS per creare un nuovo modello, crea anche un set di cinque file di visualizzazione: Crea, Elimina, Dettagli, Modifica e Indice. Due di queste viste, Crea e Modifica, hanno lo scopo di consentire all'utente di aggiungere / modificare i dati per i campi nei record del database che sono alla base del modello. Per quelle viste in un'app reale, probabilmente vorrai eseguire una certa quantità di convalida dei dati utilizzando la libreria di convalida jquery prima di salvare il record nel db. Ecco perché VS aggiunge le seguenti righe

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

in fondo a queste due visualizzazioni e non ad altre. Il codice generato automaticamente sta tentando di rendere disponibile la libreria di convalida per quelle viste, ma non per le altre.

L'errore si verifica perché VS non aggiunge una riga corrispondente al file _Layout.cshtml condiviso o, vedi una risposta sopra, la aggiunge ma la lascia commentata. Questa linea è

@RenderSection("scripts", required: false)

Se alcune delle tue viste hanno una sezione di script (come Crea e Modifica), ci deve essere un comando RenderSection incorporato nel layout. Se alcuni script hanno la sezione e altri no (come Elimina, Dettagli e Indice no), il comando RenderSection deve avere il required: falseparametro.

Quindi la soluzione migliore, se vuoi fare qualcosa di più che finire di camminare attraverso il tutorial, è aggiungere l'istruzione a _Layout.cshtml e non rimuovere il codice dalle viste Modifica e Crea.

PS È un po 'un po' confuso, qui, il fatto che ciò che viene richiesto sia in un "bundle" e l'istruzione require sembra che stia cercando di includere un file in una cartella di bundle che non esiste nel progetto. Tuttavia, per build di debug e tutorial, ciò non è rilevante poiché i file in bundle vengono inclusi uno alla volta. Vedere: http://www.asp.net/mvc/overview/performance/bundling-and-minification Il codice in questione qui è menzionato brevemente a circa due terzi della pagina.


Questo "oscilla" ed è davvero una buona spiegazione. Forse è arrivato più tardi, quindi non ha ottenuto molti voti ...
JosephDoggie

2

Mentre lavoravo con il tutorial di ASP.NET MVC 4 con Visual Studio 2012, ho riscontrato lo stesso errore nella sezione "Accesso ai dati del modello da un controller". La soluzione è abbastanza semplice.

Quando si crea una nuova applicazione Web ASP.NET MVC 4 in Visual Studio 2012 all'interno del documento _Layout.cshtml nella cartella condivisa, la sezione "script" viene disattivata.

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

Rimuovere semplicemente il commento dalla riga e il codice di esempio dovrebbe funzionare.

    @RenderSection("scripts", required: false)

1

Ho lo stesso problema durante l'implementazione di un tutorial per i principianti di MVC. Ho vari suggerimenti per modificare @RenderSection nel file layout.cshtml ma non l'ho usato.

Ho cercato molto e poi ho scoperto che il tag script generato in un (View / Edit.cshtml) e altri file cshtml non vengono visualizzati

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

} **

Quindi ho rimosso quelle linee e l'applicazione ha iniziato a funzionare senza problemi.



0

Ho cercato l'errore nel web e sono arrivato a questa pagina. Sto usando Visual Studio 2015 e questo è il mio primo progetto MVC.

Se perdi il simbolo @ prima della sezione di rendering, otterrai lo stesso errore. Vorrei condividerlo con i futuri principianti.

 @RenderSection("headscripts", required: false)

0

Ho la sensazione che tu stia eseguendo il rendering della tua sezione dall'interno di una sezione @ nel file _Layout che si riferisce a una vista parziale con una sezione @, ovvero hai annidato una sezione @ all'interno di una sezione @. Nel file _Layout, rimuovere la sezione @ attorno alla sezione di rendering.


0

Ho risolto questo problema utilizzando quanto segue,

@await Html.PartialAsync("_ValidationScriptsPartial")

0

Per me il problema era nel mio _Layout.cshtml ho RenderSection all'interno di una condizione

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

e nella vista di mio figlio era senza condizioni

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

quindi, indipendentemente dal tema, il bambino stava aggiungendo il piè di pagina. Ma nel genitore, quando il tema non è rosso o verde, non aggiungeva il piè di pagina e veniva generata un'eccezione non gestita.


-1

controllare l'ortografia e le maiuscole / minuscole del termine ""

ogni volta che scriviamo @RenderSection ("name", required: false) assicurati che la vista razor contenga una sezione @section name {} quindi controlla l'ortografia e le maiuscole / minuscole del termine "" La correzione in questo caso è "Scripts"


-1

Assicurati di aver digitato l'ortografia corretta utilizzando la sezione script visualizzata

il corretto è

@section scripts{ //your script here}

se hai digitato @section script{ //your script here}questo è sbagliato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.