MVC 4 @Scripts "não existe"

201

Acabei de criar um projeto ASP.NET MVC 4 e usei o Visual Studio 2012 RC para criar um Controller e Razor Views para IndexeCreate Actions.

Quando vim para executar o aplicativo e naveguei até a Createexibição, o seguinte erro foi mostrado:

Mensagem de erro do compilador: CS0103: O nome 'Scripts' não existe no contexto atual

O problema é o seguinte código que foi adicionado automaticamente à parte inferior da tela:

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

Por que os scripts não existem?

Eu olhei para a classe base da página da Web em Assembly System.Web.Mvc.dll, v4.0.0.0

Eu posso ver as seguintes propriedades auxiliares disponíveis:

  • Ajax
  • Html
  • URL

Mas nada chamado Scripts.

Alguma ideia?

EDITAR:

Meu arquivo Web.config é parecido com este (intocado daquele que o Visual Studio criou):

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

EDIT # 2:

As pessoas estão blogando sobre o uso do @Scriptsajudante:

No entanto, tendo acabado de instalar o Visual Studio 2012 RC em uma nova instalação do Windows 8, ainda não consigo usá-lo @Scripts, embora o Visual Studio o adicione ao modo de exibição gerado!

As soluções são apresentadas abaixo.

Não sei ao certo como encerrar isso, porque no final uma atualização parecia resolver o problema. Verifiquei novamente se havia realizado uma instalação limpa, usando um novo projeto. Mas o mesmo projeto falho que eu fiz funcionou bem agora, depois de várias atualizações e nenhuma intervenção óbvia manual. Obrigado por todos os pensamentos, mas havia definitivamente um problema no momento;)

FantasticJamieBurns
fonte
já tente adicionar no Web.config? <system.web.webPages.razor> <pages pageBaseType=""> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> etc... </pages>
Zach dev
Eu adicionei a seção do Web.config, mas não mudei nada nesse arquivo.
FantasticJamieBurns
6
Você quer dizer o arquivo "Meus modos de exibição \ Web.config" e não a raiz web.config do aplicativo. De qualquer forma, está incorreto e ausente <add namespace = "System.Web.Optimization" />. Você instalou o VS12 Beta antes do RC? Qual versão win8?
RickAndMSFT
@RickAndMSFT Fiz uma instalação limpa do Win8 a partir da ISO de visualização de versão, juntamente com uma instalação da VS 2012 RC ISO, para ter certeza absoluta de que não havia conflito de versões.
FantasticJamieBurns
@RickAndMSFT Minhas vistas \ Web.config perderiam qualquer vista em áreas
Maslow

Respostas:

269

A chave aqui é adicionar

 <add namespace="System.Web.Optimization" /> 

para os dois arquivos web.config. Meu cenário era que eu tinha referência de System.Web.Optimization no projeto e no principal / root web.config, mas o @Scripts ainda não funcionava corretamente. Você precisa adicionar a referência de namespace ao arquivo web.config do Views para fazê-lo funcionar.

ATUALIZAR:

Desde o lançamento do MVC 4 System.Web.Optimization agora está obsoleto. Se você estiver começando com uma solução em branco, precisará instalar o seguinte pacote de nuget:

Install-Package Microsoft.AspNet.Web.Optimization

Você ainda precisará fazer referência ao System.Web.Optimization nos arquivos web.config. Para mais informações, consulte este tópico:

Como adicionar referência ao System.Web.Optimization para o aplicativo MVC-3 convertido em 4

Como muitos apontaram, a reinicialização do VS pode ser necessária após as etapas acima para fazer esse trabalho.

Marko
fonte
8
Talvez você também precise executar a Install-Package Microsoft.AspNet.Web.Optimizationpartir de um modelo em branco do ASP.NET MVC4, pois ele não está incluído por padrão.
Portman
@Portman Sim, de fato, se você iniciou com um modelo de projeto MVC em branco, precisa instalar o pacote Microsoft.AspNet.Web.Optimization.
Marko
2
Ele só precisa ser adicionado no web.config na pasta Views para mim.
user1534664
9
Esta é realmente a solução. No entanto, eu precisava reiniciar o visual studio para que isso fosse reconhecido.
Jason Eades 23/02
4
Eu tive que adicionar isso ao meu Views / Web.config e reiniciar o Visual Studio.
Caverman 6/09/16
48

@Stylese @Scriptssão 2 novos ajudantes fornecidos porSystem.Web.Optimization biblioteca. Como o nome sugere, eles agrupam e reduzem arquivos ou recursos CSS e JavaScript, respectivamente.

Tente incluir o espaço System.Web.Optimizationpara nome por @usingdiretiva ou por meio deweb.config

http://ofps.oreilly.com/titles/9781449320317/ch_ClientOptimization.html#BundlingAndMinification

ATUALIZAR

A Microsoft mudou o pacote / minificação para um pacote separado chamado Microsoft.AspNet.Web.Optimization. Você pode baixar o assembly do nuget .

Esta postagem será útil para você.

VJAI
fonte
2
A adição de System.Web.Optimization diz "CS0234: O tipo ou nome do espaço para nome 'Otimização' não existe no espaço para nome 'System.Web". Não há nenhuma referência chamada System.Web.Optimization para adicionar qualquer um.
FantasticJamieBurns
1
O espaço para nome System.Web.Optimization ficou obsoleto desde que isso foi respondido; tente usar o Microsoft.AspNet.Web.Optimization. Veja esta pergunta para obter mais informações: stackoverflow.com/questions/9475893/…
Jeremy Jarrell 02/02
3
Esclarecimento: O System.Web.Optimizationespaço para nome NÃO é descontinuado, o System.Web.Optimization.dllé.
Despertar
Obrigado! Está funcionando para mim quando tive problemas com o Layout das diferentes ÁREAS.
Desenvolvedor
48

Faltava um pequeno passo acima, que encontrei em outro post. Depois de adicionar

<add namespace="System.Web.Optimization" />

nos seus ~/Views/web.confignamespaces, feche e abra novamente o Visual Studio. Era isso que eu tinha que fazer para que isso funcionasse.

Ben
fonte
2
Mesmo aqui, o reinício do VS funcionou, mas antes disso ainda mostrava o erro ...?
Andreas
Fechando VS não era necessário no meu caso, mas eu tive que fechar e reabrir o .cshtml ver que eu estava usando
joalcego
29

Estou usando áreas, e acabei de me deparar com esse problema, copiei os namespaces do root web.config para a web de áreas. config e agora funciona !!

    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />        
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
N40JPJ
fonte
15

Eu tive o mesmo problema e usei o WinMerge para me ajudar a descobrir isso. Mas, enquanto eu pesquisava mais, descobri que Rick tinha o post perfeito no blog para ele.

Resumo:

  • Adicionar <add namespace="System.Web.Optimization"/> aos dois arquivos web.config
  • Corre Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization
  • Atualizar código de agregação
  • Atualizar arquivo de layout
  • A última etapa é atualizar outras 10 bibliotecas. Eu não fiz e funcionou bem. Parece que você pode procrastinar este (a menos que eu já tenha atualizado 1 ou mais deles). :)
Dan Friedman
fonte
Obrigado por responder este Dan! (E apontando o meu blog). Sua pergunta implicava que ele começou com RC, mas acho que você está certo. Ele acabou de adicionar um controlador com RC a um projeto Beta.
RickAndMSFT
Já se passaram algumas semanas e vocês dois certamente me fizeram adivinhar. Eu certamente coloquei o VS 2012 no meu tablet, que nunca teve nada além do Metro Apps e o vi falhar. Vou tentar novamente em uma VM.
FantasticJamieBurns
Isso funcionou para mim. Leia o artigo vinculado para obter instruções exatas sobre o que você precisa fazer.
Justin
11

Eu tive o mesmo problema:

A versão System.Web.Optimization que eu estava usando estava desatualizada para o MVC4 RC.

Atualizei meus pacotes usando o gerenciador de pacotes no VS 2010.

Neste blog do MSDN , o Sr. Andy fala sobre como atualizar seu projeto MVC 4 Beta para o MVC 4 RC. A atualização dos meus pacotes levou os Scripts (principalmente o de otimização da Web) a resolver para mim:

Para instalar o pacote System.Web.Optimization mais recente, use o Console do Gerenciador de Pacotes (Ferramentas -> Biblioteca Gerenciador de Pacotes -> Console do Gerenciador de Pacotes) e execute o comando abaixo:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization

Use o arquivo System.Web.Optimization incluído no pacote em suas referências.

Para atualizar outros pacotes: Menu Ferramentas -> Gerenciador de Pacotes de Biblioteca -> Gerenciar Pacotes NuGet para Solução.

WWC
fonte
5

Crie um novo aplicativo de internet MVC 4 RC e execute-o. Navegue para Login que usa o mesmo código

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

O que permite que o Login.cshtml funcione é o arquivo Views \ Web.config (não a versão raiz do aplicativo) contém

<namespaces>

    <add namespace="System.Web.Optimization"/>

  </namespaces>

Por que sua visualização Criar não está funcionando e o Login está?

RickAndMSFT
fonte
Eu não estava usando o Login - que pode ter sido quebrado na época.
FantasticJamieBurns
5

Importe System.Web.Optimization na parte superior da sua exibição de navalha da seguinte maneira:

@using System.Web.Optimization
xAditya3393
fonte
3

Corri para este problema, no entanto, ao executar o comando:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization 

Recebi a mensagem enigmática (tenho que amar um grande trocadilho antes da primeira xícara de café):

Pacote de Instalação: O algoritmo criptográfico especificado não é suportado nesta plataforma.

Estou executando isso no Windows XP SP3 (não por opção) e o que descobri foi que eu tinha que seguir as instruções postadas pelo usuário artsnob no Fórum ASP.NET

  • Por favor, desinstale o Nuget e tente reinstalá-lo. Se você não conseguir fazer isso, faça o login como administrador.
  • Vá para Ferramentas => Gerenciador de extensões => Selecione "Gerenciador de pacotes Nuget" => Desinstalar
  • Instale-o novamente, pesquisando "Nuget" => Instalar.
  • Se não funcionou, tente instalar a versão 1.7.x, como mencionei no post anterior (não significa que você precise usar a versão anterior; se funcionar bem, podemos relatar esse bug e obter o patches para a versão mais recente).

Depois de executar isso, eu poderia executar a linha de comando para atualizar o Web.Optimization.

Espero que isso poupe alguém a cavar.

Jake1164
fonte
2

Apenas escreva

@section Scripts{
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/jqueryval")"></script>
}
archil
fonte
@archil Obrigado pela substituição - essa será uma boa solução temporária. Mas a questão principal era "Por que os scripts não existem?"
FantasticJamieBurns
@ Jamie deveria existir? Quero dizer, tanto quanto me lembro, não há ajudante de Scipts por aí. Talvez você esteja tentando usar um ajudante de terceiros?
Archil
1
Eu mesmo não adicionei esse código - o Visual Studio 2012 RC o adicionou quando criou a Exibir para minha Ação de Criação. Eu acho que de alguma forma meu MVC 4 não é o caminho certo. Deve trabalhar em algum lugar, porque Scott Hanselman faz menção a sintaxe não como sendo uma nova adição ao MVC 4 RC: hanselman.com/blog/...
FantasticJamieBurns
1

Atualizei do Beta para o RC e enfrentei o tópico 'Scripts' não existe. Naveguei por toda a web e a solução final foi o que o N40JPJ disse, além de outra solução alternativa:

Copie o seguinte em View \ Web.config:

  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.Optimization"/>
    <add namespace="System.Web.Helpers"/>
  </namespaces>

e o seguinte em View \ Shared_Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

Espero que ajude.

Mohsen Afshin
fonte
1
Não há necessidade de usar, a if (IsSectionDefined())menos que você esteja fornecendo uma elsecláusula. O fato de você estar dizendo required: falsejá permite que essa seção não seja definida e, nesse caso, a seção será omitida. Portanto, este é um código extra desnecessário.
ErikE
0

Aparentemente, você criou um tipo de projeto 'Vazio' sem a pasta 'Scripts'. Meu conselho - crie um tipo de projeto 'Básico' com a pasta 'Scripts' completa.

Com relação a todos os desenvolvedores.

Kammer
fonte
0

basta remover / ocultar o código da tela de criação e edição do seu controlador.

 @section Scripts {  

   @Scripts.Render("~/bundles/jqueryval")  
 }  
atik sarker
fonte
0
  1. : remove a página de visualização.
  2. : adicionar espaço para nome webconfig (no diretório de exibição)
  3. : criar ver uma tentativa!

boa sorte...

Esat
fonte
0

Mais um para o pote - passamos idades tentando resolver o mesmo problema - mesmo que ele tenha sido definido no web.config para root e a raiz do Views. Acontece que eu o adicionei por engano ao elemento <system.web><pages><namespaces>, e não ao <system.web**.webPages.razor**><pages><namespaces>elemento.

Realmente fácil perder isso!

PoorbandTony
fonte
0

Quando entro em uma página que possui esse código:

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

Este erro ocorre: Erro. Um erro ocorreu durante o processamento do seu pedido.

E essa exceção está registrada nos meus logs:

System.Web.HttpException (0x80004005): The controller for path '/bundles/jqueryval' was not found or does not implement IController.
   em System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
...

Eu tentei todas as dicas desta página e nenhuma delas foi resolvida por mim. Então, olhei na minha pasta Packages e notei que tenho duas versões para o System.Web.Optmization.dll:

  • Microsoft.AspNet.Web.Optimization.1.1.0 (v1.1.30515.0 - 68,7KB)
  • Microsoft.Web.Optimization.1.0.0-beta (v1.0.0.0 - 304 KB)

Meu projeto estava fazendo referência à versão beta mais antiga. Eu mudei apenas a referência para a versão mais recente (69KB) e tudo funcionou bem.

Eu acho que isso pode ajudar alguém.

rkawano
fonte
0

Isso tem uma solução óbvia. Eu tive o mesmo problema mais tarde. Não está relacionado às referências de montagem ou ... .Isso ocorrerá na chamada hierárquica das visualizações Parciais do MVC, quando você tiver estruturas de página complicadas. Portanto, chamar / renderizar cada parte separadamente em cada página (talvez uma página mestra ou parcial) fará com que não veja partes necessárias da página, como o código a seguir:

@RenderSection("Scripts", required: false)

Isso simplesmente força a página a encontrar e processar a seção relacionada e, em caso de falha, mostra uma mensagem de erro como você.

Portanto, sugiro que você rastreie suas páginas (como o rastreio de programa) do mestre para todas as suas partes parciais para Detectar dependências . Talvez seja um trabalho terrível, mas não há outras opções disponíveis aqui.

Não que, de acordo com minha experiência, algumas situações condicionais na programação façam com que você não mostre o erro correto que causa o problema.

Amirhossein Mehrvarzi
fonte
0

Eu tive esse problema depois de adicionar uma área a um projeto que não tinha nenhum. Para se livrar dele, basta copiar o web.config dentro da pasta Views raiz para a pasta Views da área e começar a funcionar.

Stefano.net
fonte
0

Resolvo esse problema no MvcMusicStore adicionando esta parte do código em _Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

e remova esse código do Edit.cshtml

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

Execute o programa que o inshallah funcionará com você.

احمد الباكري
fonte
0

Para mim, isso resolveu o problema, no console do gerenciador de pacotes do NuGet, escreva o seguinte:

update-package microsoft.aspnet.mvc -reinstall
Adão
fonte
0

Quando comecei a usar o MVC4 recentemente, enfrentei o problema acima ao criar um projeto com os modelos vazios. Etapas para corrigir o problema.

  1. Saltar TOOLS-> Library Package Manager-> Packager Manager Console Cole o comando abaixo e pressione enter Install-Package Microsoft.AspNet.Web.Optimization Nota: aguarde a instalação bem-sucedida.
  2. Vá para o arquivo Web.Config no nível raiz e adicione o espaço para nome abaixo na seção espaço para nome das páginas. adicionar<namespace="System.Web.Optimization" />
  3. Vá para Web.Config na pasta Views e siga a etapa 2.
  4. Crie a solução e execute.

O pacote mencionado na etapa 1 adicionará poucas bibliotecas do sistema às referências da solução, como System.Web.Optimization não é uma referência padrão para modelos vazios no MVC4.

Eu espero que isso ajude. Obrigado

Radha G
fonte
0

Ocorreu um erro muito semelhante ao atualizar um projeto do MVC3 para o MVC4.

Mensagem de erro do compilador: CS0103: O nome [blah] não existe no contexto atual

No meu caso, eu havia desatualizado os números de versão em vários dos meus Web.Configs.

  1. Eu precisava atualizar o número da versão System.Web.Mvc de "3.0.0.0" para "4.0.0.0" em cada Web.Config no meu projeto.
  2. Eu precisava atualizar todos os meus números de versão System.Web.WebPages, System.Web.Helpers e System.Web.Razor de "1.0.0.0" para "2.0.0.0" em cada Web.Config no meu projeto.

Ex:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

...

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

Certifique-se de revisar o Web.Configs em cada um dos diretórios do Views.

Você pode ler mais sobre a atualização de um projeto do ASP.NET MVC 3 para o ASP.NET MVC 4 .

Mac
fonte
0

Se você adicionou ao seu web.config e ele ainda mostra uma mensagem, é necessário fechar o seu projeto e reabri-lo, agora ele existirá e @ Styles.Render ("") e @ Scripts.Render () funcionarão bem.

Muhammad Shahid Khan Afridi
fonte
-1

Tente o seguinte:

@section Scripts 
{
    Scripts.Render("~/bundles/jqueryval")  // <- without ampersand at the begin
}
user2280510
fonte