O nome 'ViewBag' não existe no contexto atual


89

Estou tentando usar o ViewBag em meu aplicativo, tenho todas as dlls recentes, a versão mais recente do MVC 3, mas ainda estou recebendo o erro:

"O nome 'ViewBag' não existe no contexto atual"

Eu até desinstalei e reinstalei o MVC 3 e ainda não houve nenhuma mudança.

Além disso, não acredito que as dll's estejam aparecendo no GAC.

Qual pode ser o meu problema? Ou como adicionar dll's ao GAC?


1
Tenha em mente que para 5.2.2.0 o web.config deve apontar para 5.2.2.0, mas Views / web.config para 5.1.0.0 para montagem MVC
Bart Calixto

Respostas:


39

Você precisa adicionar a configuração do Razor específica do MVC ao seu web.config. Veja aqui: Razor HtmlHelper Extensions (ou outros namespaces para visualizações) não encontrado

Use a ferramenta de atualização MVC 3 para garantir automaticamente que você tenha os valores de configuração corretos.


Obrigado! Esse link ajudou! Acho que tudo isso é resultado de fazer um site que estava no MVC 3 Beta, e quando você obtém a versão mais recente, as configurações da web não são alteradas. Obrigado!
dia

Eu atualizei minha postagem com isso, bem como uma correção relacionada: stevesmithblog.com/blog/…
ssmith

Você pode usar a ferramenta de atualização (veja a resposta atualizada) para garantir que sua configuração esteja correta.
marcind de

3
Apenas uma observação: se você tiver locais de visualização adicionais, ou seja, fora do ~/Viewslocal normal , copie o ~/Views/Web.configpara esse local também.
Dave Thieben

83

Eu estava tendo o mesmo problema. Descobri que estava faltando o ./Views/Web.configarquivo, porque criei o projeto a partir de um aplicativo ASP.NET vazio em vez de usar um modelo ASP.NET MVC.

Para ASP.NET MVC 5, um ./Views/Web.configarquivo vanilla contém o seguinte:

<?xml version="1.0"?>

<!-- https://stackoverflow.com/a/19899269/178082 -->
<configuration>
    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        </sectionGroup>
    </configSections>

    <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.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>

    <appSettings>
        <add key="webpages:Enabled" value="false" />
    </appSettings>

    <system.web>
        <httpHandlers>
            <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
        </httpHandlers>

        <!--
                Enabling request validation in view pages would cause validation to occur
                after the input has already been processed by the controller. By default
                MVC performs request validation before a controller processes the input.
                To change this behavior apply the ValidateInputAttribute to a
                controller or action.
        -->
        <pages
                validateRequest="false"
                pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <controls>
                <add assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
            </controls>
        </pages>
    </system.web>

    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />

        <handlers>
            <remove name="BlockViewHandler"/>
            <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
        </handlers>
    </system.webServer>
</configuration>

Adicionar um ./Views/Web.configarquivo com esse conteúdo resolveu esse problema para mim.


3
Solução finalmente. Não implantei o arquivo /Views/Web.config no servidor e esse arquivo ausente foi a causa do erro.
Stack Man de

2
voltou e usei esta solução uma 2ª vez! :)
user230910

2
Depois de perder um dia tentando descobrir, isso funcionou para mim. Obrigado. A única coisa que eu precisava adicionar à tag <namespaces> em "./Views/Web.config era; <add namespace="System.Web.Optimization"/>
dunwan

no meu caso, por algum motivo, os elementos não estavam no web.config raiz, mas foram adicionados a um web.config em 'Visualizações' quando criei um layout MVC5. Migrei os elementos para a raiz web.config e excluí o 'extra' (??) web.config
JDPeckham

2
Cara, Deus te abençoe por isso. Fiquei EXTREMAMENTE irritado com isso.
Dragan B.

19

Tente limpar e reconstruir. Funcionou no meu caso.


Não posso acreditar que perdi meu tempo imaginando o que havia de errado com meu código ... obrigado, funcionou
Mr_Hmp

enfurecedor que isso funcione ... eu sempre esqueço de fazer isso e perco tanto tempo ... não deveria ser necessário
TCC

no meu caso, tive que deletar a pasta de pacotes da solução e fazer uma limpeza
Nerdroid

9

Tive o mesmo problema em uma solução que foi atualizada para MVC 5 no Visual Studio 2015.

No arquivo web.config da pasta Views (não no web.config raiz), atualizei o número da versão referido em <configSections>de 2.0.0.0para 3.0.0.0.

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

2
Muito obrigado! Essa coisa de versão é uma loucura. Toda vez que eu ligo para o MS, as atualizações são uma sobre a outra. Ling to SQL é substituído por Entity Framework, MVC foi de 1 para 6, e assim por diante.
JustJohn

Obrigado, consertou meu problema com o VS2017.
QuickNull

O aplicativo VS 2019 mvc 5 corrigido.
MrDywar

6

Depois de tentar coisas diferentes, descobri que era o cache do VS. Você pode resolver isso excluindo os arquivos de cache localizados em:

C: \ Users \ your.name.here \ AppData \ Local \ Microsoft \ VisualStudio \ 14.0 \ ComponentModelCache

Fechei meu projeto, apaguei os arquivos daquele caminho e reabri meu projeto, limpei a solução e a construí novamente e o problema foi resolvido

Os arquivos serão recriados na próxima vez que você iniciar o Visual Studio


Isso funcionou para mim na v15 (VS 2017) também. Eu provavelmente nunca teria pensado em fazer isso ... obrigado por uma grande economia de tempo, Wilson & Silver!
Paul Schroeder

Caminho universal%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache
decreto de

3

Eu tive o mesmo problema e o crimbo me deu a pista certa, foi causado pelo arquivo ./Views/Web.config que estava presente, mas não contém os namespaces corretos, eu acho ...

Eu criei um projeto MVC5 em branco e importei seu ./Views/Web.config em meu projeto existente e as ondas vermelhas em cada uso de ViewBag sumiram!


Visual Studio 2013, criado projeto da web em branco com a caixa MVC marcada. Ele cria toda a estrutura de arquivos com referências mínimas de namespace MVC. Eu adicionei um controlador e visualização simples. Recebi erros de compilação "O tipo ou nome do namespace 'Ajax' não existe no namespace 'System.Web.Mvc' (falta uma referência de assembly)". O Editor de Arquivos também mostra o aviso "O nome 'ViewBag' não existe no contexto atual". Vá para Referências do projeto, encontre System.Web.Mvc, defina a cópia local como verdadeira. limpar a construção e reconstruir, resolveu meu problema.
Kagan Agun de


2

Eu tinha um ./Views/Web.Configarquivo, mas esse erro aconteceu após a publicação do site. Acontece que a propriedade de ação de construção no arquivo foi definida como em Nonevez de Content. Alterar isso para Contentpermitir que a publicação funcione corretamente.


1

Tive esse problema depois de alterar o namespace padrão do aplicativo na caixa de diálogo Propriedades.

O ./Views/Web.Config continha uma referência ao antigo namespace


Sim, e dá uma mensagem de erro no lugar completamente errado .. vale a pena verificar se existem todos os namespaces que são mencionados em TODOS os arquivos web.config - Eu tinha um namespace antigo no arquivo web / config da Área causando muitos problemas
user230910

1

No meu caso, alterar a página da web: Versão para o valor adequado resolveu meu problema, para mim o valor correto era (2.0.0.0 em vez de 3.0.0.0):

<appSettings>
        <add key="webpages:Version" value="2.0.0.0"/>
        <add key="webpages:Enabled" value="false"/>

1

Depois de tentar todas as abordagens, nenhuma delas funcionou para mim, pois tudo que eu tinha eram configurações corretas. finalmente

Excluir todos os arquivos de "temp" e "% temp%" do sistema ajudou a resolver esse problema.

Abra o comando Executar (Windows + R), digite as strings acima e exclua todos os arquivos temporários.


Obrigado! Depois de tentar de tudo, funcionou para mim.
user390480

1

Se você tentou todas as respostas disponíveis e ainda não conseguiu encontrar a resposta, isso pode resolver o problema. Se você tiver diferentes configurações de soluções como Debug, Release etc, defina o caminho de saída do projeto para 'bin' e compile o projeto. Reverta a alteração após compilar.

Caminho de saída do projeto

VS procura dlls na pasta bin


1

Eu já havia tentado deletar o arquivo bin e obj e reiniciar o VS e não tive sorte.

Eu também já tive esse problema muitas vezes e é difícil resolvê-lo a cada vez. Freqüentemente, é devido ao arquivo web.config não ter a versão correta de uma das referências. Isso significa clicar na referência no Visual Studio para ver a versão na guia de propriedades e, em seguida, combiná-la com a versão nos arquivos web.config.

Outra maneira é (se possível) atualizar para uma versão posterior da estrutura .net e, em seguida, excluir os arquivos bin / obj e reiniciar o Visual Studio. Eu só posso supor que está mudando algo no

Uma verificação rápida da diferença entre o arquivo csproj não mostra nenhuma grande diferença ... Mas as diferenças que ele mostrou foram (adicionei (removi) para mostrar a linha antiga)

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> (remove)
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>(remove)
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>

No arquivo Web.Config (não aquele na Visualização)

<add key="webpages:Version" value="2.0.0.0" /> (remove)
<add key="webpages:Version" value="3.0.0.0"/>

Ele também adicionou (ao mesmo arquivo web.config), mas eu o removi manualmente

 <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

Finalmente, no console do gerenciador de pacotes, adicione update-package

Execute o site localmente e veja quaisquer erros de compilação que foram corrigidos pelo meu segundo parágrafo (correspondendo às versões das referências)


0

Atualizei as páginas da web: Versão na pasta ./Views/Web.Config, mas essa configuração também estava presente em web.config na raiz. Atualize ambos ou remova do web.config raiz


0

Como já mencionado @Wilson Vallecilla. Siga as etapas abaixo para excluir o cache:

Siga o caminho abaixo para descobrir os arquivos:

C:\Users\your.name.here\AppData\Local\Microsoft\VisualStudio\14.0\ComponentModelCache

Exclua todos os quatro arquivos:

  • Microsoft.VisualStudio.Default.cache
  • Microsoft.VisualStudio.Default.catalogs
  • Microsoft.VisualStudio.Default.err
  • Microsoft.VisualStudio.Default.external

Fechei meu projeto, apaguei os arquivos daquele caminho e reabri meu projeto, limpei a solução e a construí novamente e o problema foi resolvido

Excluir seus arquivos ASP.NET temporários também ajuda. Arquivos ASP.NET C: \ Users \ your.name.here \ AppData \ Local \ Temp \ Temporary.

Isso funciona para mim.

Obrigado!


0

Para MVC5, caso você esteja construindo um aplicativo do zero. Você precisa adicionar um arquivo web.config à pasta Views e colar o seguinte código nele.

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

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.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>
</configuration>

Observe que para MVC 3 você terá que alterar a versão para 3.0.0.0 em

<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

Pode ser necessário fechar e abrir a página * .cshtml novamente para ver as alterações.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.