O nome 'modelo' não existe no contexto atual no MVC3

119

Eu adicionei uma página cshtml em um projeto. Quando tentei adicionar a seguinte declaração, recebo um erro: "O nome 'modelo' não existe no contexto atual".

@model xyz.abc.SomeClass

Eu verifiquei as referências, todas elas estão no lugar. Eu adicionei um web.config na pasta view, mas isso não foi corrigido.

Falta alguma coisa?

user602737
fonte
Se você está procurando uma solução MVC4, a resposta de Adam é válida, você precisa encontrar o número da versão correta em seu web.config principal e usá-lo aqui. A pasta MVC4 Views web.config estava ausente na linha <host> e copiava uma da raiz web.config (pode ter outros valores diferentes, verifique os seus) e coloque-a no Views. Em seguida, fechamos o projeto e o recarregamos no Visual Studio e ele fez o truque.
Farrukh Subhani

Respostas:

238

Atualização: se você estiver usando uma versão mais recente do MVC, o mesmo processo se aplica, mas certifique-se de usar o número da versão correta na <host>linha do web.config .

Bem, eu me deparei com a mesma coisa que você e, depois de algumas pesquisas, descobri qual é o problema!

Você precisa incluir o web.config MVC3 padrão para a pasta Views. O MVC3 possui dois: um na raiz do seu aplicativo e outro na pasta de visualizações. Isso possui uma seção para namespaces incluídos. Certifique-se de que o seu seja algo parecido com isto:

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

Sugiro que você crie um novo projeto MVC3 e copie o web.config criado para você na sua pasta views.

Importante Depois de fazer isso, você precisa fechar o arquivo e reabri-lo. Voila! Intellisense!

Adam Terlson
fonte
1
Não posso marcar isso como resposta, mas esse também foi o meu problema. Esqueci de adicionar essas seções ao web.config.
21711 Dave
Sim, gostaria de poder marcar a sua como a resposta. Fiquei preso por um tempo (desisti depois que minha primeira tentativa de converter para o Razor falhou), e esse era o problema o tempo todo. Obrigado!
Brian Donahue
3
Não funciona para mim. Ou, pelo menos, às vezes eu entro no senso comum e às vezes não, mesmo tendo tudo isso definido no web.config na pasta Views.
Tom Lianza
Muito obrigado! Ele salvou meu dia!
21812 Sergey
9
certifique-se de atualização para versão mais recente (para MVC 5 aqui) no seu MAINarquivo web.config<add key="webpages:Version" value="3.0.0.0" />
Simon_Weaver
30

Encontrei esse mesmo problema quando criei uma nova área para organizar minhas páginas. Minha estrutura parecia:

WebProject

- [] Areas
    - [] NewArea
        - [] Controllers
        - [] Views
- [] Controllers
- [] Views
    - Web.config
- Web.config

As visualizações criadas na pasta Views no WebProject funcionaram bem, mas as views criadas na NewArea geraram o seguinte erro:

O nome 'modelo' não existe no contexto atual.

Para corrigir isso, copiei o web.config na pasta Views no WebProject para a pasta Views no NewArea. Ver abaixo.

WebProject

- [] Areas
    - [] NewArea
        - [] Controllers
        - [] Views
            - **Web.config**
- [] Controllers
- [] Views
    - Web.config
- Web.config

Eu me deparei com isso porque criei manualmente essa nova área usando Adicionar -> Nova Pasta para adicionar as pastas. Eu deveria ter clicado com o botão direito do mouse no projeto e selecionado Adicionar -> Área. Em seguida, o Visual Studio cuidaria de configurar a área corretamente.

Paul Syfrett
fonte
2
+1 ... Eu notei que, por algum motivo que web.config não foi incluído, feliz que eu encontrei a resposta para resolver o meu problema
pollirrata
2
Sei que isso é antigo, mas na verdade eu tinha o mesmo problema hoje, então queria agradecer por esta resposta. :)
Ricky Mutschlechner
Eu também tive o mesmo problema e a solução semelhante. Meu Views/Web.configreferenciava a System.Web.Mvc.MvcWebRazorHostFactoryversão 5.0.0.0 e eu tinha uma Área de terceiros referenciando a v4.0 e com as visualizações cooperando. I definir Views/Web.configvolta para v4.0 e tudo funcionou.
Códigos com Hammer
foi especificamente seu comentário sobre a substituição do web.config pelo da pasta Views que me ajudou a corrigir isso. simplesmente tornar o conteúdo exatamente o mesmo não funciona por algum motivo insano. AAARRRGGGHHH! ;)
Ryan Vettese
No meu caso, eu uso o robocopy para sincronizar a versão local com a versão do servidor, excluindo todos os arquivos web.config. sem o arquivo web.config na versão do servidor, esse erro será exibido.
Will Wu
11

Se suas visualizações estão em um assembly de biblioteca de classes, o que é útil para reutilizar visualizações compartilhadas entre projetos, basta fazer o que Adam sugere pode não ser suficiente. Eu ainda tinha problemas, mesmo com isso.

Tente isso em seu web.config na raiz do seu projeto:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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>
  <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.Helpers" />
        <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.WebPages" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.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" />
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
    <pages>
      <namespaces>
        <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.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>

E isso no web.config na sua pasta views:

<?xml version="1.0"?>

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

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

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

  <system.web>
    <httpHandlers>
      <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
    </httpHandlers>
    <pages
        validateRequest="false"
        pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=4.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>

Isso funcionou para mim. Agora eu tenho intellisense e nenhum erro de compilação em meus modos de exibição em um projeto que não seja MVC que eu possa referenciar em vários sites MVC.

Greg Jackman
fonte
1
Isso é para os arquivos web.config no seu projeto web ou os arquivos web.config na sua biblioteca de classes?
theJerm 01/05
7

Corri para esse problema quando inadvertidamente tinha uma cópia do arquivo de exibição (About.cshtml) para a rota / about no diretório raiz. (Não é a pasta views). Depois que o arquivo foi removido da raiz, o problema foi resolvido.

James Lawruk
fonte
1
Obrigado! Acabo ficando louco com o mesmo problema e esta foi a resposta ;-)
Rob
Legal! Lembro-me de enlouquecer também. :)
James Lawruk
Eu tinha alguns arquivos .cshtml em uma pasta no diretório raiz, o que causou apenas falha de pasta nas minhas visualizações ... while (true) {bashHeadToWall; } Obrigado.
matt.j.crawford
7

Teve problemas semelhantes ao usar o VS2012 e o VS2013.
A adição da seguinte linha ao <appSettings> no web.config principal funcionou:

<add key="webpages:Version" value="3.0.0.0" />

Se a linha já estava lá, mas disse 2.0.0.0, alterá-la para 3.0.0.0 funcionou.


fonte
Esse foi o meu problema também após realizar uma atualização do MVC. Dizia 2.0.0.0, ao mudar para 3, funcionava.
FerX32 20/03/19
6

Atualização: 5/5/2015 Para o seu projeto MVC 5, você precisa definir a Versão como 5.0.0.0 em seu /views/web.config

<system.web.webPages.razor>
     <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</system.web.webPages.razor>
phanf
fonte
1
Sim encontrou a versão 5.2.0.0, que está causando o problema, mas alterá-lo para 5.0.0.0 corrigiu-o !!! Obrigado.
precisa
5

Enquanto você declara o modelo na parte superior da visualização usando código como este:

@model MyModel

você precisa capitalizar suas referências a ele abaixo, por exemplo:

@Html.Encode(Model.MyDisplayValue)

Acredito que um web.config ausente na pasta Views seria a principal causa disso, mas se isso for corrigido e o problema persistir, verifique se você está usando Model , não model, para se referir a ele na fonte.

Bork Blatt
fonte
1
Isso resolve o erro quando o problema é que você está tentando referenciar seu modelo em seu próprio código na exibição, como quando você
cria
3

Também encontrei esse problema. Minhas circunstâncias eram um pouco diferentes.

  1. Uma das minhas pastas de exibição foi acidentalmente movida para o diretório raiz do meu projeto. Isso levou à rota project_root/SignUp/ViewNamecorrespondente antes project_root/Views/SignUp/ViewName. Isso causou o @modelerro.

  2. Depois de mover as visualizações de volta para o local apropriado, o diretório foi recriado de alguma forma na raiz do projeto. Desta vez, vazio. /SignUp/ViewNamefuncionou, mas /SignUp/lançou um 403 - Forbidden: Access is denied.erro. A pasta inteira deve ser removida da raiz do projeto.

Espero que isso ajude alguém. Passei horas acreditando que o problema foi causado por nossa atualização recente do MVC 3 para o MVC 4. Apenas uma observação: os problemas de atualização devem ocorrer apenas entre o MVC 2 e o MVC 3. Se você vir esse problema em versões posteriores, provavelmente não é devido ao melhoria.


fonte
2

Levei séculos para resolver esse problema, mas finalmente espero ter resolvido o problema no MVC, que é semelhante:

Eu reinstalei o ASP.NET 4.5 ( http://www.asp.net/downloads )

Eu segui o tutorial de atualização em http://www.asp.net/whitepapers/mvc4-release-notes

MAS este parágrafo mencionado está errado para mim

System.Web.Mvc, Version=4.0.0.0
System.Web.WebPages, Version=2.0.0.0
System.Web.Helpers, Version=2.0.0.0
System.Web.WebPages.Razor, Version=2.0.0.0

Como eu tenho o Razor no System.Web.Razor , alterei o namespace do razor para System.Web.Razor.

Adicione isso ao seu web.config

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

Eu adicionei a referência de montagem a todas essas montagens acima

Localize o elemento ProjectTypeGuids e substitua {E53F8FEA-EAE0-44A6-8774-FFD645390401} por {E3E379DF-F4C6-4180-9B81-6769533ABE47}.

Isso é tudo.

Tomas Kubes
fonte
1
A adição de appsettings ao webconfig resolveu isso para mim. Embora eu ache que <add key="webpages:Version" value="2.0.0.0" />é o fator determinante, a outra configuração não é necessária.
Shoe
1
para o MVC 5, isso precisa ser, 3.0.0.0mas sim, isso é muito importante!
Simon_Weaver
2

É um erro horrível, mas:

Certifique-se de ter arquivos Web.config em seu modo de exibição no controle remoto . Talvez você tenha pulado para enviá-lo pelos filtros do seu programa FTP.

Pcodea Xonos
fonte
2

Estava faltando o web.config em Areas / MyArea / Views / web.config. Uma vez adicionado, funcionou bem. Isso foi com o MVC 5 e o .NET4.5

Vencedor
fonte
O meu também estava faltando, com a ajuda deste site, consegui funcionar novamente. forums.asp.net/t/…
Marpos
0

Há também outra razão. No meu caso, copiei um arquivo index.cshtml para a pasta raiz da web (fora da pasta Views) como um backup do servidor remoto.

Então, continuei alterando meu /views/web.config, alterando meu /views/home/index.cshtml e o erro continuou acontecendo ... até descobrir o /index.cshtml fora da pasta views, excluí-lo e, com certeza, ele tudo voltou ao normal!

Nestor
fonte
0

Encontrei o mesmo problema, mas no meu caso, a única coisa que mudou foi que eu desinstalei o Visual Studio 2012 e instalei o Visual Studio 2013. Abri nossa solução, mas continuava recebendo o mesmo The name 'model' does not exist in current contexterro em todas as visualizações do Razor.

Meu colega de trabalho sugeriu a verificação de atualizações para o VS2013. Depois de instalar a atualização 1 do VS2013 , parei de receber esse erro.

John Washam
fonte
1
Estou recebendo esse erro com a Atualização 2 do VS2013 . Com a Atualização 1, estava funcionando bem. Ainda não foi possível encontrar uma solução para isso. Tentei desinstalar a atualização 2, mas isso resultou no VS travando após a abertura de um arquivo cshtml.
Iheartcsharp
Eu tenho o mesmo problema com a atualização 2. do VS2013.
EricP 07/07
0

Verifique seu arquivo de configuração no diretório views. no add a chave para MVC 4/5

sansalk
fonte
0

Reinstalar o nuget resolveu para mim

PM> Pacote de Instalação Microsoft.AspNet.Razor -Version 3.2.3

pixelagent
fonte
0

Para mim, esse era o problema. Todo esse bloco estava faltando na seção.

  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Routing, Version=4.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" />
    <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  </assemblies>
Kevin Dark
fonte
0

Eu tenho o mesmo problema depois de atualizar os pacotes. Fiz tudo o que você escreveu acima neste tópico, mas o vermelho subjacente à palavra-chave model não desapareceu. Mais tarde, encontrou a solução: apenas excluiu a pasta 'package' do diretório do meu projeto e reconstruí-la, enquanto isso o NuGet restaurava os pacotes ausentes. Atualizado, e pronto!

Peter.k
fonte
0

Verifique se o arquivo web.config deve existir nos arquivos publicados

Arash Farahani
fonte
0

Eu estava enfrentando o mesmo problema e, em seguida, encontro uma solução. A solução é:

  1. Feche o Visual Studio
  2. Exclua o arquivo SUO
  3. Reinicie o Visual Studio

O arquivo .suo é um arquivo oculto na mesma pasta em que o arquivo de solução .svn existe. Espero que funcione!

Arsman Ahmad
fonte