Les sections suivantes ont été définies mais n'ont pas été rendues pour la page de mise en page «~ / Views / Shared / _Layout.cshtml»: «Scripts»

101

Je suis nouveau sur ASP MVC et j'utilise le didacticiel Introduction à ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

Je rencontre une erreur à laquelle je n'arrive pas à trouver de réponse et je n'ai pas beaucoup d'expérience en programmation, donc je ne sais même pas par où commencer pour résoudre ce problème et passer au didacticiel. J'apprécie toute aide que vous pouvez fournir.

Je suis dans la section Accéder aux données de votre modèle à partir d'un contrôleur et j'obtiens cette erreur lorsque je tente de créer un film dans le cadre du didacticiel, je clique sur le lien "Créer un nouveau" et j'obtiens l'erreur suivante

Les sections suivantes ont été définies mais n'ont pas été rendues pour la page de mise en page> "~ / Views / Shared / _Layout.cshtml": "Scripts"

Plutôt que d'utiliser Visual Studio express, j'ai choisi de télécharger Visual Studio 2012 RC (je ne sais pas si cela serait la cause première de mon problème.

Je sais que vous pouvez m'exiger d'inclure du code pour répondre à cela, mais je ne suis pas sûr du code à inclure. Veuillez indiquer le code que vous devez inclure le cas échéant et je serai heureux de l'ajouter à ma question.

Merci,

Kevin Dark
la source
Vous devez suivre la version Visual Studio 2012 de ce didacticiel asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT
1
J'ai eu le même problème et mon problème a été résolu lorsque j'ai retiré RenderSection de @ {} et utilisé uniquement @. Je ne sais pas pourquoi cela se produit
Guilherme Ferreira
1
Lien dans le commentaire RickAnd ci-dessus ne fonctionne pas pour moi. Mais plus important encore, ce n'est pas un problème de didacticiel, c'est un problème de génération de code VS qui est facilement résolu et ne devrait pas être simplement masqué en supprimant la ligne défaillante comme le suggèrent de nombreuses réponses en dessous de celle acceptée. Voir ma réponse ( stackoverflow.com/a/27152625/165164 ) ci-dessous pour une discussion de ce qui se passe réellement - au moins pour certaines versions de VS.
Anne Gunn
L'erreur déclarée est produite lorsqu'une vue a défini un @sectionqui n'est PAS rendu dans le Layout (avec RenderSection). Cela peut se produire si vous avez fait référence Layoutà une mise en page incorrecte ou si vous avez oublié de référencer une mise en page. Voir la réponse de @ vonv
StuartLC

Réponses:

144

Cela signifie que vous avez défini une section dans votre Layout.cshtml principal, mais que vous n'avez rien inclus pour cette section dans votre vue.

Si votre _Layout.cshtml a quelque chose comme ceci:

@RenderSection("scripts")

Ensuite, toutes les vues qui utilisent cette mise en page doivent inclure un @sectionavec le même nom (même si le contenu de la section est vide):

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

Comme alternative, vous pouvez définir required sur false, vous ne serez pas obligé d'ajouter la section dans chaque vue,

@RenderSection("scripts", required: false)

ou vous pouvez également envelopper le @RenderSectiondans un ifbloc,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
mgnoonan
la source
7
Votre réponse a été utile. Je n'ai identifié aucun @RenderSection ("Scripts") dans _Layout.cshtml, mais j'ai remarqué dans les vues qui ont été automatiquement créées lors de la création de mon contrôleur de films pour ce didacticiel, que celles-ci avaient des scripts @section {@ Scripts.Render (" ~ / bundles / jqueryval ")} J'ai donc supprimé ceux-ci pour le moment et tout fonctionne pour le moment.
Kevin Dark du
23
tandis que votre réponse est bonne. Je pense que vous devriez souligner que l'ajout de , required: false)ce dernier lui @RenderSection("scripts", required: false)permettra d'être inclus ou non.
Eonasdan
3
@ KDark11 Lors de la création d'une vue, VS vous demande si vous souhaitez référencer les scripts. Décochez simplement cela.
Eonasdan du
1
Je suis d'accord que mettre @RenderSection("scripts", required: false)dans le _Layout.cshtml généré est la bonne solution. (Voir la discussion ci-dessous pour savoir pourquoi.) De cette façon, vous pouvez ajouter le correctif dans un seul fichier, pas tous - un correctif beaucoup plus DRYer.
Anne Gunn
@Eonasdan wow c'est génial! quand ont-ils ajouté cette fonctionnalité? s'il vous plaît ne me dites pas v1.0: - /
Simon_Weaver
25

En outre, vous pouvez ajouter la ligne suivante à _Layout.cshtmlou _Layout.Mobile.cshtml:

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

J'ai eu un cas avec 3 niveaux a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Même en faisant comme ça:

_MainLayout.cshtml

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

_Middle.cshtml

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

et dans Page.cshtml définissant

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

J'aurais toujours l'erreur

Les sections suivantes ont été définies mais n'ont pas été rendues pour la page de mise en page «~ / Views / Shared / _Middle.cshtml»: «head».

Il s'est avéré que l'erreur était que Middle.cshtml s'appuie sur /Views/_ViewStart.cshtml pour résoudre sa mise en page parent. Le problème a été résolu en définissant ceci explicitement dans Middle.cshtml :

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

Impossible de décider si ce serait par conception ou un bogue dans MVC 4 - de toute façon, le problème a été résolu :)

Frederik Struck-Schøning
la source
J'ai le même problème. Le point est que j'appelle RenderSection avant RenderBody et dans Body Content, je définis la section. Est-ce que ça pourrait être?
Guilherme Ferreira
1
Aujourd'hui, j'ai appris à faire une "mise en page intermédiaire" grâce à l'exemple de code ici. @section Foo {@RenderSection("Foo")}pour "transmettre" les sections! Doit également transmettre le corps avec @RenderBody().
starlocke
very clever :)))
ehsan il y a
11

Je ne sais pas pourquoi la réponse acceptée a été acceptée si la solution suggérée ne résout pas et ne résout pas le problème. Il peut en fait y avoir deux problèmes liés à ce sujet.

Numéro 1

La page maître (par exemple _Layout.cshtml) a une section définie et elle est obligatoire mais les vues héritées ne l'ont pas implémentée. Par exemple,

Le modèle de mise en page

<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 vue héritée

Pas besoin d'afficher de code, considérez simplement qu'il n'y a pas d' implémentation de @section OptionBox {}sur la vue.

L'erreur du problème n ° 1

Section not defined: "OptionBox ".

Problème n ° 2

La page maître (par exemple _Layout.cshtml) a une section définie et elle est requise ET la vue héritière l' a implémentée. Cependant, la vue d'implémentation a des scriptsections supplémentaires qui ne sont définies sur (aucune de) ses pages maîtres.

Le modèle de mise en page

same as above

La vue héritée

<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'erreur du problème n ° 2

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

Le problème du PO est similaire au problème n ° 2 et la réponse acceptée concerne le problème n ° 1.

von c.
la source
3
D'accord, le commentaire d'OP est qu'il a supprimé une section en vue de résoudre l'erreur, ce qui signifie qu'il avait une section définie dans une vue, mais pas dans la mise en page, pas l'inverse car la plupart des réponses adressent (Problème n ° 2 qui correspond à l'erreur qu'ils décrivent) Toutes les autres réponses décrivent une situation qui ne produirait pas cette erreur, mais à la place "Section non définie" plutôt que "sections ont été définies mais ... non rendues".
AaronLS
8

Je pense que notre solution était suffisamment différente de tout le monde, je vais donc la documenter ici.

Nous avons configuré la mise en page principale, une mise en page intermédiaire, puis le rendu final de la page d'action. Main.cshtml <- Config.cshtml <- Action.cshtml

Ce n'est que lorsque web.config a customErrors='On/RemoteOnly'eu une erreur personnalisée et aucune exception ni Application_Errorn'a été appelé. Je pourrais attraper cela en Layout = nullligne dans Error.cshtml. L'exception était comme dans la question, la section des scripts manquants.

Nous l'avons défini dans Main.cshtml (avec required: false) et Action.cshtml n'a rien écrit dans la section scripts.

La solution était d'ajouter @section scripts { @RenderSection("scripts", false) }à Config.cshtml.

Pasi Savolainen
la source
7

Cela se produit essentiellement lorsque _Layout.cshtml est sans:

@RenderSection("scripts", required: false)

ou avec

@RenderSection("scripts")  

SANS POUR AUTANT

required: false

Donc, ajoutez simplement @RenderSection ("scripts", requis: false) dans _Layout.cshtml et cela fonctionne spécialement pour les développeurs qui travaillent avec des projets générés par Kendoui.

JMJ
la source
7

Il semble qu'il existe une incompatibilité entre les fichiers View que certaines versions de Visual Studio génèrent automatiquement pour vous lorsque vous l'utilisez pour créer un nouveau modèle. J'ai rencontré ce problème en utilisant la nouvelle édition communautaire VS 2013 et en parcourant le didacticiel W3Schools à l' adresse http://www.w3schools.com/aspnet/mvc_app.asp, mais les commentaires ci-dessus indiquent que ce n'est pas un problème avec les instructions du didacticiel ou avec un version unique de VS.

Il est vrai que vous pouvez faire le message d'erreur se estompe en soulevant simplement le

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

ligne à partir des mises en page de création / modification qui ont été générées automatiquement par Visual Studio.

Mais cette solution ne s'attaque pas à la cause fondamentale et ne vous laisse pas dans un bon endroit pour faire plus que finir de parcourir le didacticiel. À un moment donné (probablement assez tôt) dans le développement d'une application réelle, vous allez vouloir accéder au code de validation jquery que la solution de commentaire supprime de votre application.

Si vous utilisez VS pour créer un nouveau modèle pour vous, il crée également un ensemble de cinq fichiers View: Créer, Supprimer, Détails, Modifier et Index. Deux de ces vues, Créer et Modifier, sont destinées à permettre à l'utilisateur d'ajouter / de modifier des données pour les champs dans les enregistrements de base de données qui sous-tendent le modèle. Pour ces vues dans une vraie application, vous voudrez probablement faire une certaine quantité de validation de données à l'aide de la bibliothèque de validation jquery avant d'enregistrer l'enregistrement dans la base de données. C'est pourquoi VS ajoute les lignes suivantes

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

au fond de ces deux points de vue et pas d’autres. Le code généré automatiquement tente de rendre la bibliothèque de validation disponible pour ces vues, mais pas pour les autres.

L'erreur se produit parce que VS n'ajoute pas de ligne correspondante au fichier _Layout.cshtml partagé ou, voir une réponse ci-dessus, l'ajoute mais la laisse en commentaire. Cette ligne est

@RenderSection("scripts", required: false)

Si certaines de vos vues ont une section de scripts (comme le font Créer et Modifier), il doit y avoir une commande RenderSection intégrée dans la mise en page. Si certains scripts ont la section et d'autres pas (contrairement à Delete, Details et Index), la commande RenderSection doit avoir le required: falseparamètre.

Donc, la meilleure solution, si vous voulez faire autre chose que simplement finir de parcourir le didacticiel, est d'ajouter l'instruction à _Layout.cshtml et non de supprimer le code des vues Modifier et Créer.

PS C'est un peu déroutant, ici, que ce qui est requis est dans un 'bundle' et que l'instruction require semble vouloir inclure un fichier dans un dossier bundles qui n'existe pas dans votre projet. Mais, pour les versions de débogage et les didacticiels, ce n'est pas pertinent car les fichiers fournis sont inclus un par un. Voir: http://www.asp.net/mvc/overview/performance/bundling-and-minification Le code qui est en cause ici est brièvement mentionné aux deux tiers environ de la page.

Anne Gunn
la source
Cela "bascule" et c'est une très bonne explication. Peut-être est-il arrivé plus tard, donc n'a pas obtenu beaucoup de votes ....
JosephDoggie
2

En travaillant sur le didacticiel ASP.NET MVC 4 avec Visual Studio 2012, j'ai rencontré la même erreur dans la section «Accès aux données de votre modèle à partir d'un contrôleur». Le correctif est assez simple.

Lors de la création d'une nouvelle application Web ASP.NET MVC 4 dans Visual Studio 2012 dans le document _Layout.cshtml dans le dossier partagé, la section «scripts» est mise en commentaire.

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

Décommentez simplement la ligne et l'exemple de code devrait fonctionner.

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

J'ai le même problème lors de la mise en œuvre d'un tutoriel pour les débutants de MVC. J'ai reçu diverses suggestions pour modifier la @RenderSection dans votre fichier layout.cshtml mais je ne l'ai pas utilisé.

J'ai beaucoup cherché et j'ai trouvé que la balise de script générée dans un (View / Edit.cshtml) et un autre fichier cshtml ne rendait pas

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

} **

J'ai donc supprimé ces lignes et l'application a commencé à fonctionner correctement.

Tejas Sawant
la source
1

J'ai également commenté ** @ section Scripts que cela fonctionne bien. :)

Pallavi
la source
Merci. Ça a aidé :)
noobprogrammer le
0

J'ai recherché l'erreur sur le Web et suis arrivé sur cette page. J'utilise Visual Studio 2015 et c'est mon premier projet MVC.

Si vous manquez le symbole @ avant la section de rendu, vous obtiendrez la même erreur. Je voudrais partager ceci pour les futurs débutants.

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

J'ai l'impression que vous rendez votre section à partir d'une @section dans le fichier _Layout qui fait référence à une vue partielle avec une @section, c'est-à-dire que vous avez imbriqué une @section dans une @section. Dans le fichier _Layout, supprimez la @section autour de la section de rendu.

Andrei Magasiner
la source
0

J'ai résolu ce problème en utilisant ce qui suit,

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

Pour moi, le problème était dans mon _Layout.cshtml J'ai RenderSection dans une condition

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

et à mon avis d'enfant c'était sans condition

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

donc quel que soit le thème, l'enfant ajoutait le pied de page. Mais dans le parent, lorsque le thème n'est pas rouge ou vert, il n'ajoutait pas le pied de page et une exception non gérée était levée.

Jaydeep Shil
la source
-1

vérifier l’épellation et les majuscules / minuscules du terme ""

chaque fois que nous écrivons @RenderSection ("name", obligatoire: false) assurez-vous que la vue rasoir Contient une section @section name {} donc vérifiez l'orthographe et les majuscules / minuscules du terme "" Correct dans ce cas est "Scripts"

Sous-phase
la source
-1

Veuillez vous assurer que vous avez saisi l'orthographe correcte de l'utilisation de la section de script dans la vue

le correct est

@section scripts{ //your script here}

si vous avez tapé @section script{ //your script here}c'est faux.

Petter Friberg
la source