Se han definido las siguientes secciones, pero no se han renderizado para la página de diseño "~ / Views / Shared / _Layout.cshtml": "Scripts"

100

Soy nuevo en ASP MVC y estoy utilizando el tutorial de Introducción a ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

Me encuentro con un error para el que parece que no puedo encontrar una respuesta ni tengo mucha experiencia en programación, por lo que no sé ni por dónde empezar a solucionarlo y continúa con el tutorial. Agradezco cualquier ayuda que pueda brindar.

Estoy en la sección Accediendo a los datos de su modelo desde un controlador y obtengo este error cuando intento crear una película como parte del tutorial, hago clic en el enlace "Crear nuevo" y aparece el siguiente error

Se han definido las siguientes secciones pero no se han renderizado para la página de diseño> "~ / Views / Shared / _Layout.cshtml": "Scripts"

En lugar de usar Visual Studio Express, opté por descargar Visual Studio 2012 RC (no estoy seguro de si esa sería la causa principal de mi problema.

Me doy cuenta de que puede solicitarme que incluya un código para responder a esto, pero no estoy seguro de qué código incluir. Indique qué código necesita que incluya, si corresponde, y con gusto lo agregaré a mi pregunta.

Gracias,

Kevin oscuro
fuente
Debe seguir la versión de Visual Studio 2012 de ese tutorial asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT
1
Tuve el mismo problema y mi problema se resolvió cuando saqué RenderSection de @ {} y usé solo @. No tengo idea de por qué sucede esto
Guilherme Ferreira
1
Enlace en RickAnd comentario anterior no funciona para mí. Pero lo que es más importante, este no es un problema de tutorial, es un problema de generación de código VS que se soluciona fácilmente y no debe ser simplemente tapado eliminando la línea defectuosa como sugieren muchas respuestas debajo de la aceptada. Vea mi respuesta ( stackoverflow.com/a/27152625/165164 ) a continuación para obtener una discusión de lo que realmente está sucediendo, al menos para algunas versiones de VS.
Anne Gunn
El error indicado se produce cuando una vista tiene definida una @sectionque NO se renderiza en el Layout (con RenderSection). Esto puede ocurrir si ha hecho referencia Layouta un diseño incorrecto o si ha olvidado hacer referencia a un diseño. Vea la respuesta de @ vonv
StuartLC

Respuestas:

144

Significa que ha definido una sección en su Layout.cshtml maestro, pero no ha incluido nada para esa sección en su Vista.

Si su _Layout.cshtml tiene algo como esto:

@RenderSection("scripts")

Luego, todas las Vistas que usan ese Diseño deben incluir un @sectionnombre con el mismo nombre (incluso si el contenido de la sección está vacío):

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

Como alternativa, puede establecer required en false, entonces no se le pedirá que agregue la sección en cada vista,

@RenderSection("scripts", required: false)

o también puedes envolverlo @RenderSectionen un ifbloque,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
mgnoonan
fuente
7
Tu respuesta fue útil. No identifiqué ninguna @RenderSection ("Scripts") dentro de _Layout.cshtml pero noté en las vistas que se crearon automáticamente al crear mi controlador de películas para este tutorial, que tenían @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Así que los borré por el momento y todo está funcionando por ahora.
Kevin Dark
23
mientras tu respuesta es buena. Creo que debería señalar que la adición de , required: false)lo que @RenderSection("scripts", required: false)va a permitir que se incluye o no.
Eonasdan
3
@ KDark11 Al crear una vista, VS le pregunta si desea hacer referencia a los scripts. Simplemente desmarque eso.
Eonasdan
1
Estoy de acuerdo en que poner @RenderSection("scripts", required: false)en el _Layout.cshtml generado es la solución correcta. (Vea la discusión a continuación para saber por qué). De esa manera, puede agregar la solución en un archivo, no en todos: una solución mucho más SECA.
Anne Gunn
@Eonasdan ¡guau, eso es increíble! ¿Cuándo agregaron esa característica? por favor no me digas v1.0: - /
Simon_Weaver
25

Además, puede agregar la siguiente línea a _Layout.cshtmlo _Layout.Mobile.cshtml:

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

Tuve un caso con 3 niveles a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Aunque haciendo así:

_MainLayout.cshtml

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

_Middle.cshtml

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

y en Page.cshtml definiendo

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

Todavía obtendría el error

Se han definido las siguientes secciones pero no se han renderizado para la página de diseño “~ / Views / Shared / _Middle.cshtml”: "head".

Resultó que el error era que Middle.cshtml confiaba en /Views/_ViewStart.cshtml para resolver su diseño principal. El problema se resolvió definiendo esto en Middle.cshtml explícitamente:

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

No puedo decidir si esto sería por diseño o un error en MVC 4; de todos modos, el problema se resolvió :)

Frederik Struck-Schøning
fuente
Tengo el mismo problema. El punto es que estoy llamando a RenderSection antes de RenderBody y dentro de Body Content estoy definiendo la sección. ¿Podría ser?
Guilherme Ferreira
Hoy aprendí cómo hacer un "diseño intermedio" gracias al ejemplo de código aquí. @section Foo {@RenderSection("Foo")}para "transmitir" las secciones! También tuvo que pasar el cuerpo con @RenderBody().
starlocke
11

No estoy seguro de por qué se aceptó la respuesta aceptada si la solución sugerida no resolvió y no resuelve el problema. En realidad, puede haber dos problemas relacionados con este tema.

Número 1

La página maestra (por ejemplo _Layout.cshtml) tiene una sección definida y es necesaria, pero las vistas heredadas no la implementaron. Por ejemplo,

La plantilla de diseño

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

No es necesario mostrar ningún código, solo considere que no hay implementación de @section OptionBox {}en la vista.

El error del número 1

Section not defined: "OptionBox ".

Número 2

La página maestra (por ejemplo _Layout.cshtml) tiene una sección definida y es necesaria Y la vista heredada la implementó. Sin embargo, la vista de implementación tiene scriptsecciones adicionales que no están definidas en (ninguna de) sus páginas maestras.

La plantilla de diseño

same as above

La vista heredera

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

El error del número 2

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

El problema del OP es similar al problema n. ° 2 y la respuesta aceptada es para el problema n. ° 1.

von v.
fuente
3
De acuerdo, el comentario de OP es que eliminó una sección con el fin de resolver el error, lo que significa que tenía una sección definida en una vista, pero no en el diseño, no al revés, ya que la mayoría de las respuestas abordan (Problema # 2 que corresponde a el error que describen) Todas las otras respuestas describen una situación que no produciría ese error, pero en cambio "Sección no definida" en lugar de "Se han definido secciones pero ... no se han renderizado".
AaronLS
8

Creo que nuestra solución fue lo suficientemente diferente a la de todos los demás, así que la documentaré aquí.

Tenemos la configuración del diseño principal, un diseño intermedio y luego el render de la página de acción final. Main.cshtml <- Config.cshtml <- Action.cshtml

Solo cuando web.config tuvo customErrors='On/RemoteOnly'un error personalizado y no Application_Errorse llamó ni una excepción . Podría captar esto en Layout = nulllínea en el Error.cshtml. La excepción fue como en la pregunta, falta la sección de guiones.

Lo teníamos definido en Main.cshtml (con required: false) y Action.cshtml no tenía nada que escribir en la sección de scripts.

La solución fue agregar @section scripts { @RenderSection("scripts", false) }a Config.cshtml.

Pasi Savolainen
fuente
7

Ocurre básicamente cuando _Layout.cshtml no tiene:

@RenderSection("scripts", required: false)

o con

@RenderSection("scripts")  

SIN

required: false

Entonces, simplemente agregue @RenderSection ("scripts", required: false) en _Layout.cshtml y funciona especialmente para aquellos desarrolladores que trabajan con proyectos generados por Kendoui.

JMJ
fuente
7

Parece que existe una discrepancia entre los archivos de vista que algunas versiones de Visual Studio generan automáticamente cuando lo usa para crear un nuevo modelo. Encontré este problema usando la nueva VS 2013 Community Edition y siguiendo el tutorial de W3Schools en http://www.w3schools.com/aspnet/mvc_app.asp pero los comentarios anteriores indican que no es un problema con las instrucciones del tutorial o con un versión única de VS.

Es cierto que puede hacer que el mensaje de error desaparezca simplemente quitando el

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

línea de los diseños de creación / edición que fueron generados automáticamente por Visual Studio.

Pero esa solución no aborda la causa raíz ni lo deja en un buen lugar para hacer más que terminar de recorrer el tutorial. En algún momento (probablemente bastante temprano) en el desarrollo de una aplicación real, querrá acceder al código de validación de jquery que la solución de comentarios elimina de su aplicación.

Si usa VS para crear un nuevo modelo para usted, también crea un conjunto de cinco archivos de visualización: Crear, Eliminar, Detalles, Editar e Índice. Dos de estas vistas, Crear y Editar, están destinadas a permitir al usuario agregar / editar datos para los campos en los registros de la base de datos que subyacen al modelo. Para esas vistas en una aplicación real, probablemente querrá hacer una cierta cantidad de validación de datos utilizando la biblioteca de validación jquery antes de guardar el registro en el archivo db. Es por eso que VS agrega las siguientes líneas

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

al final de esas dos vistas y no a otras. El código generado automáticamente intenta que la biblioteca de validación esté disponible para esas vistas, pero no para las demás.

El error ocurre porque VS no agrega una línea correspondiente al archivo compartido _Layout.cshtml o, vea una respuesta arriba, lo agrega pero lo deja comentado. Esta linea es

@RenderSection("scripts", required: false)

Si algunas de sus vistas tienen una sección de scripts (como crear y editar), tiene que haber un comando RenderSection incrustado en el diseño. Si algunos scripts tienen la sección y otros no (como Delete, Details e Index no), el comando RenderSection debe tener el required: falseparámetro.

Entonces, la mejor solución, si desea hacer algo más que terminar el tutorial, es agregar la declaración a _Layout.cshtml, no eliminar el código de las vistas Editar y Crear.

PD: Es un poco confuso, aquí, que lo que se requiere está en un 'paquete' y la declaración require parece que está tratando de incluir un archivo en una carpeta de paquetes que no existe en su proyecto. Pero, para las compilaciones de depuración y los tutoriales, eso no es relevante ya que los archivos empaquetados se incluyen uno a la vez. Ver: http://www.asp.net/mvc/overview/performance/bundling-and-minification El código que está en cuestión aquí se menciona brevemente aproximadamente dos tercios del camino hacia abajo en la página.

Anne Gunn
fuente
Esto "mola" y es una muy buena explicación. Quizás llegó más tarde, por lo que no obtuvo muchos votos ....
JosephDoggie
2

Mientras trabajaba en el Tutorial de ASP.NET MVC 4 con Visual Studio 2012, encontré el mismo error en la sección "Acceso a los datos de su modelo desde un controlador". La solución es bastante sencilla.

Al crear una nueva aplicación web ASP.NET MVC 4 en Visual Studio 2012 dentro del documento _Layout.cshtml en la carpeta compartida, se comenta la sección "scripts".

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

Simplemente elimine los comentarios de la línea y el código de muestra debería funcionar.

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

Tengo el mismo problema al implementar un tutorial para principiantes de MVC. Recibí varias sugerencias para modificar @RenderSection en su archivo layout.cshtml pero no lo he usado.

He buscado mucho y luego encontré que la etiqueta de secuencia de comandos generada en un (Ver / Editar.cshtml) y otro archivo cshtml no se está procesando

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

} **

Así que eliminé esas líneas y la aplicación comenzó a funcionar sin problemas.

Tejas Sawant
fuente
1

También he comentado ** @ sección Scripts que está funcionando sin problemas. :)

Pallavi
fuente
Gracias. Ayudó :)
noobprogrammer
0

Busqué el error en la web y llegué a esta página. Estoy usando Visual Studio 2015 y este es mi primer proyecto MVC.

Si pierde el símbolo @ antes de la sección de render, obtendrá el mismo error. Me gustaría compartir esto para futuros principiantes.

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

Tengo la sensación de que está renderizando su sección desde una @section en el archivo _Layout que se refiere a una vista parcial con una @section, es decir, ha anidado una @section dentro de una @section. En el archivo _Layout, elimine la sección @ alrededor de la sección de representación.

Andrei Magasiner
fuente
0

Resolví este problema usando lo siguiente,

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

Para mí, el problema estaba en mi _Layout.cshtml Tengo RenderSection dentro de una condición

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

y en mi opinión de niño fue sin condición

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

así que independientemente del tema, el niño estaba agregando el pie de página. Pero en el padre, cuando el tema no es rojo o verde, no se agrega el pie de página y se lanza una excepción sin mano.

Jaydeep Shil
fuente
-1

comprobar la ortografía y las mayúsculas / minúsculas del término ""

siempre que escribamos @RenderSection ("nombre", obligatorio: falso) asegúrese de que la vista de la navaja contenga una sección @nombre de la sección {}, así que verifique la ortografía y las mayúsculas / minúsculas del término "". En este caso, lo correcto es "Scripts".

Subhasis
fuente
-1

Asegúrese de haber escrito correctamente la ortografía del uso de la sección de script en la vista

lo correcto es

@section scripts{ //your script here}

si escribió @section script{ //your script here}esto es incorrecto.

Petter Friberg
fuente