As seguintes seções foram definidas, mas não foram renderizadas para a página de layout “~ / Views / Shared / _Layout.cshtml”: “Scripts”

100

Sou novo no ASP MVC e utilizo o tutorial de introdução ao ASP MVC 4 Beta http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet -mvc-4

Estou encontrando um erro para o qual não consigo encontrar uma resposta, nem tenho muita experiência em programação, então não sei por onde começar para corrigir isso e seguir em frente com o tutorial. Agradeço qualquer ajuda que você possa fornecer.

Estou na seção Acessando os dados do seu modelo a partir de um controlador e recebo este erro quando tento criar um filme como parte do tutorial, clico no link "Criar novo" e recebo o seguinte erro

As seguintes seções foram definidas, mas não foram renderizadas para a página de layout> "~ / Views / Shared / _Layout.cshtml": "Scripts"

Em vez de usar o Visual Studio Express, optei por baixar o Visual Studio 2012 RC (não tenho certeza se essa seria a causa raiz do meu problema.

Sei que você pode exigir que eu inclua um código para responder a isso, mas não tenho certeza de qual código incluir. Informe qual código você precisa que eu inclua, se houver, e ficarei feliz em adicioná-lo à minha pergunta.

Obrigado,

Kevin Dark
fonte
Você deve seguir a versão do Visual Studio 2012 desse tutorial asp.net/mvc/tutorials/mvc-4/…
RickAndMSFT
1
Eu tive o mesmo problema e meu problema foi resolvido quando tirei RenderSection de @ {} e usei apenas @. Não tenho ideia do por que isso acontece
Guilherme Ferreira
1
Link em RickAnd comentário acima não funciona para mim. Mas, o mais importante, este não é um problema de tutorial, é um problema de geração de código do VS que é facilmente corrigido e não deve ser apenas encoberto removendo a linha com falha, conforme sugerem muitas respostas abaixo da aceita. Veja minha resposta ( stackoverflow.com/a/27152625/165164 ) abaixo para uma discussão sobre o que realmente está acontecendo - pelo menos para algumas versões do VS.
Anne Gunn
O erro declarado é produzido quando uma visão definiu um @sectionque NÃO é renderizado no Layout (com RenderSection). Isso pode ocorrer se você fez referência ao errado Layoutou se esqueceu de fazer referência a um layout. Ver a resposta de
@vonv

Respostas:

144

Significa que você definiu uma seção em seu Layout.cshtml mestre, mas não incluiu nada para essa seção em sua Visualização.

Se o seu _Layout.cshtml tiver algo assim:

@RenderSection("scripts")

Então, todas as visualizações que usam esse layout devem incluir um @sectioncom o mesmo nome (mesmo se o conteúdo da seção estiver vazio):

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

Como alternativa, você pode definir required como false, então não será necessário adicionar a seção em cada View,

@RenderSection("scripts", required: false)

ou você também pode embrulhar o @RenderSectionem um ifbloco,

@if (IsSectionDefined("scripts"))
{
    RenderSection("scripts");
}
Mgnoonan
fonte
7
Sua resposta foi útil. Não identifiquei nenhum @RenderSection ("Scripts") dentro do _Layout.cshtml, mas notei nas visualizações que foram criadas automaticamente ao criar meu controlador de Filmes para este tutorial, que esses tinham @section Scripts {@ Scripts.Render (" ~ / bundles / jqueryval ")} Então, eu os apaguei por enquanto e tudo está funcionando por enquanto.
Kevin Dark
23
enquanto sua resposta é boa. Acho que você deve apontar que adicionar , required: false)fazendo isso @RenderSection("scripts", required: false)permitirá que seja incluído ou não.
Eonasdan
3
@ KDark11 Ao criar uma visão, o VS pergunta se você deseja fazer referência aos scripts. Apenas desmarque isso.
Eonasdan
1
Concordo que colocar @RenderSection("scripts", required: false)no _Layout.cshtml gerado é a solução certa. (Veja a discussão abaixo para saber o porquê.) Dessa forma, você pode adicionar a correção em um arquivo, não em todos - uma correção muito mais DRYer.
Anne Gunn
@Eonasdan uau, isso é demais! quando eles adicionaram esse recurso? por favor, não me diga v1.0: - /
Simon_Weaver
25

Além disso, você pode adicionar a seguinte linha ao _Layout.cshtmlou _Layout.Mobile.cshtml:

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

Tive um caso com 3 níveis a'la _ MainLayout.cshtml <--- _ Middle.cshtml <--- Page.cshtml . Mesmo fazendo assim:

_MainLayout.cshtml

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

_Middle.cshtml

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

e em Page.cshtml definindo

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

Eu ainda obteria o erro

As seguintes seções foram definidas, mas não foram renderizadas para a página de layout “~ / Views / Shared / _Middle.cshtml”: "head".

Acontece que o erro foi o Middle.cshtml confiar em /Views/_ViewStart.cshtml para resolver seu layout pai. O problema foi resolvido definindo isso explicitamente em Middle.cshtml :

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

Não consigo decidir se isso seria por design ou um bug no MVC 4 - de qualquer forma, o problema foi resolvido :)

Frederik Struck-Schøning
fonte
Estou tendo o mesmo problema. A questão é que estou chamando RenderSection antes de RenderBody e dentro de Body Content estou definindo a seção. Poderia ser?
Guilherme Ferreira
Hoje aprendi como fazer "layout intermediário" graças ao exemplo de código aqui. @section Foo {@RenderSection("Foo")}para "passar" as seções! Também teve que passar o corpo com @RenderBody().
starlocke de
11

Não sei por que a resposta aceita foi aceita se a solução sugerida não resolveu e não resolve o problema. Na verdade, pode haver dois problemas relacionados relacionados a este tópico.

Problema 1

A página mestra (por exemplo _Layout.cshtml) tem uma seção definida e é necessária, mas as visualizações herdadas não a implementaram. Por exemplo,

O modelo de 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>

A Visão de Herança

Não há necessidade de mostrar nenhum código, basta considerar que não implementação de @section OptionBox {}na visualização.

O erro para o problema nº 1

Section not defined: "OptionBox ".

Edição # 2

A página principal (por exemplo _Layout.cshtml) tem uma secção definida e que é necessário e o ponto de vista herdar se aplicá-lo. No entanto, a visão de implementação tem scriptseções adicionais que não são definidas em (nenhuma) sua (s) página (s) master.

O modelo de layout

same as above

A Visão de Herança

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

O erro para o problema nº 2

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

O problema do OP é semelhante ao problema nº 2 e a resposta aceita é para o problema nº 1.

von v.
fonte
3
Concordado, o comentário de OP é que ele excluiu uma seção para resolver o erro, o que significa que ele tinha uma seção definida em uma visualização, mas não no layout, não o contrário, pois a maioria das respostas abordam (Problema # 2 que corresponde a o erro que eles descrevem) Todas as outras respostas estão descrevendo uma situação que não produziria aquele erro, mas em vez disso "Seção não definida" em vez de "seções foram definidas, mas ... não renderizadas".
AaronLS de
8

Acho que nossa solução foi suficientemente diferente de todas as outras, então vou documentá-la aqui.

Configuramos o layout principal, um layout intermediário e, em seguida, a renderização da página de ação final. Main.cshtml <- Config.cshtml <- Action.cshtml

Somente quando o web.config teve customErrors='On/RemoteOnly'um erro personalizado e nenhuma exceção nem Application_Errorfoi chamado. Eu poderia pegar issoLayout = null online no Error.cshtml. A exceção era como na pergunta, seção de scripts ausente.

Nós o tínhamos definido em Main.cshtml (com required: false) e Action.cshtml não tinha nada que fosse escrito na seção de scripts.

A solução foi adicionar @section scripts { @RenderSection("scripts", false) }ao Config.cshtml.

Pasi Savolainen
fonte
7

Isso ocorre basicamente quando _Layout.cshtml está sem:

@RenderSection("scripts", required: false)

ou com

@RenderSection("scripts")  

SEM

required: false

Então, basta adicionar @RenderSection ("scripts", required: false) em _Layout.cshtml e funciona especialmente para aqueles desenvolvedores que trabalham com projetos gerados Kendoui.

JMJ
fonte
7

Parece que há uma incompatibilidade entre os arquivos de exibição que algumas versões do Visual Studio geram automaticamente para você quando você o usa para criar um novo modelo. Eu encontrei esse problema usando o novo VS 2013 Community Edition e percorrendo o tutorial W3Schools em http://www.w3schools.com/aspnet/mvc_app.asp, mas os comentários acima indicam que não é um problema com as instruções do tutorial ou com um versão única do VS.

É verdade que você pode fazer a mensagem de erro desaparecer apenas removendo o

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

linha dos layouts de criação / edição que foram gerados automaticamente pelo Visual Studio.

Mas essa solução não aborda a causa raiz nem o deixa em um bom lugar para fazer mais do que terminar de percorrer o tutorial. Em algum ponto (provavelmente bem no início) do desenvolvimento de um aplicativo real, você vai querer acessar o código de validação jquery que a solução de comentário remove de seu aplicativo.

Se você usar o VS para criar um novo modelo para você, ele também criará um conjunto de cinco arquivos de visualização: Criar, Excluir, Detalhes, Editar e Índice. Duas dessas visualizações, Criar e Editar, destinam-se a permitir ao usuário adicionar / editar dados para os campos nos registros do banco de dados que fundamentam o modelo. Para essas visualizações em um aplicativo real, você provavelmente desejará fazer alguma validação de dados usando a biblioteca de validação jquery antes de salvar o registro no banco de dados. É por isso que o VS adiciona as seguintes linhas

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

ao fundo dessas duas visualizações e não de outras. O código gerado automaticamente está tentando disponibilizar a biblioteca de validação para essas visualizações, mas não para as outras.

O erro ocorre porque o VS não adiciona uma linha correspondente ao arquivo _Layout.cshtml compartilhado ou, veja uma resposta acima, adiciona-o, mas deixa como comentário. Esta linha é

@RenderSection("scripts", required: false)

Se algumas de suas visualizações têm uma seção de scripts (como Create e Edit têm), deve haver um comando RenderSection embutido no layout. Se alguns scripts têm a seção e outros não (como Delete, Details e Index não), o comando RenderSection precisa ter o required: falseparâmetro.

Portanto, a melhor solução, se você quiser fazer algo mais do que simplesmente terminar de percorrer o tutorial, é adicionar a instrução a _Layout.cshtml e não remover o código das visualizações Editar e Criar.

PS É um pouco confuso, aqui, que o que está sendo exigido está em um 'pacote' e a instrução require parece que está tentando incluir um arquivo em uma pasta de pacotes que não existe em seu projeto. Mas, para compilações de depuração e tutoriais, isso não é relevante, pois os arquivos agrupados são incluídos um de cada vez. Consulte: http://www.asp.net/mvc/overview/performance/bundling-and-minification O código que está em questão aqui é mencionado brevemente cerca de dois terços do caminho para baixo na página.

Anne Gunn
fonte
Isso "balança" e é uma explicação muito boa. Talvez tenha chegado mais tarde, então não obteve muitos votos ...
JosephDoggie
2

Enquanto trabalhava no Tutorial da ASP.NET MVC 4 com Visual Studio 2012, encontrei o mesmo erro na seção "Acessando os dados do seu modelo a partir de um controlador". A correção é bastante simples.

Ao criar um novo aplicativo da Web ASP.NET MVC 4 no Visual Studio 2012 dentro do documento _Layout.cshtml na pasta compartilhada, a seção "scripts" é comentada.

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

Simplesmente descomente a linha e o código de amostra deve funcionar.

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

Eu tenho o mesmo problema ao implementar um tutorial para iniciantes de MVC. Recebi várias sugestões para modificar @RenderSection em seu arquivo layout.cshtml, mas não usei.

Pesquisei muito e descobri que a tag de script gerada em um (View / Edit.cshtml) e outro arquivo cshtml não está renderizando

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

} **

Então, removi essas linhas e o aplicativo começou a funcionar sem problemas.

Tejas Sawant
fonte
1

Eu também comentei ** @ section Scripts que está funcionando perfeitamente. :)

Pallavi
fonte
Obrigado. Ajudou :)
noobprogrammer
0

Procurei o erro na web e cheguei a esta página. Estou usando o Visual Studio 2015 e este é meu primeiro projeto MVC.

Se você perder o símbolo @ antes da seção de renderização, obterá o mesmo erro. Eu gostaria de compartilhar isso para futuros iniciantes.

 @RenderSection("headscripts", required: false)
CodeName 47
fonte
0

Tenho a sensação de que você está renderizando sua seção de dentro de uma @section no arquivo _Layout que se refere a uma visualização parcial com uma @section, ou seja, você aninhou uma @section dentro de uma @section. No arquivo _Layout, remova a seção @ ao redor da seção de renderização.

Andrei Magasiner
fonte
0

Resolvi esse problema usando o seguinte,

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

Para mim, o problema estava no meu _Layout.cshtml, tenho RenderSection dentro de uma condição

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

e na minha visão de criança era sem condição

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

portanto, independentemente do tema, a criança adicionava o rodapé. Mas no pai, quando o tema não é vermelho ou verde, ele não está adicionando o rodapé e uma exceção sem tratamento é lançada.

Jaydeep Shil
fonte
-1

verifique a grafia e maiúsculas / minúsculas do termo ""

sempre que escrevermos @RenderSection ("nome", obrigatório: falso), certifique-se de que a visualização do razor Contém uma seção @ nome da seção {}, portanto, verifique a ortografia e maiúsculas / minúsculas do termo "" correto neste caso é "Scripts"

Subhasis
fonte
-1

Certifique-se de que digitou a grafia correta da seção de script em vista

o correto é

@section scripts{ //your script here}

se você digitou @section script{ //your script here}isso está errado.

Petter Friberg
fonte