Le nom 'modèle' n'existe pas dans le contexte actuel dans MVC3

119

J'ai ajouté une page cshtml dans un projet. Lorsque j'essaye d'y ajouter la déclaration suivante, j'obtiens une erreur: "Le nom 'modèle' n'existe pas dans le contexte actuel".

@model xyz.abc.SomeClass

J'ai vérifié les références, elles sont toutes en place. J'ai ajouté un web.config dans le dossier de vue, mais cela ne l'a pas corrigé.

Y a-t-il quelque chose qui me manque?

utilisateur602737
la source
Si vous recherchez une solution MVC4, la réponse d'Adam est valide, vous devez trouver le numéro de version correct à partir de votre web.config principal et l'utiliser ici. MVC4 Views Le dossier web.config manquait la ligne <host> et en copiait une à partir de la racine web.config (il pourrait avoir d'autres valeurs différentes, alors vérifiez la vôtre) et mettez-la dans Views. Ensuite, nous avons fermé le projet et le recharger dans Visual Studio et cela a fait l'affaire.
Farrukh Subhani

Réponses:

238

Mise à jour: si vous utilisez une version plus récente de MVC, le même processus s'applique, assurez-vous simplement d'utiliser le numéro de version correct dans la <host>ligne web.config .

Eh bien, je me suis retrouvé à vivre la même chose que vous, et après quelques recherches supplémentaires, j'ai découvert quel était le problème!

Vous devez inclure le fichier web.config MVC3 par défaut pour le dossier Views. MVC3 en a deux: un à la racine de votre application et un pour le dossier vues. Cela a une section pour les espaces de noms inclus. Assurez-vous que le vôtre ressemble à ceci:

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

Je vous suggère de créer un nouveau projet MVC3, puis de copier simplement le web.config créé pour vous dans votre dossier de vues.

Important Une fois que vous avez fait cela, vous devez fermer le fichier et le rouvrir. Voila! Intellisense!

Adam Terlson
la source
1
Je ne peux pas marquer cela comme la réponse, mais c'était aussi mon problème. J'ai oublié d'ajouter ces sections au web.config.
Dave le
Ouais, j'aimerais pouvoir marquer la vôtre comme la réponse. J'étais coincé là-dessus pendant un moment (j'ai abandonné après l'échec de ma première tentative de conversion à Razor), et c'était le problème depuis le début. Merci!
Brian Donahue
3
Ça ne marche pas pour moi. Ou, du moins, parfois j'obtiens intellisense et parfois non, même si j'ai tout cela dans le web.config dans le dossier Views.
Tom Lianza
Merci beaucoup! Cela a sauvé ma journée!
Sergey
9
assurez-vous de mettre à jour vers la dernière version (pour MVC 5 ici) dans votre MAINfichier web.config<add key="webpages:Version" value="3.0.0.0" />
Simon_Weaver
30

J'ai rencontré ce même problème lorsque j'ai créé une nouvelle zone pour organiser mes pages. Ma structure ressemblait à:

Projet Web

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

Les vues créées dans le dossier Views sous le WebProject fonctionnaient correctement, mais les vues créées sous NewArea généraient l'erreur suivante:

Le nom «modèle» n'existe pas dans le contexte actuel.

Pour résoudre ce problème, j'ai copié le fichier web.config dans le dossier Views sous WebProject dans le dossier Views de NewArea. Voir ci-dessous.

Projet Web

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

J'ai rencontré cela parce que j'ai créé manuellement cette nouvelle zone en utilisant Ajouter -> Nouveau dossier pour ajouter les dossiers. J'aurais dû faire un clic droit sur le projet et sélectionner Ajouter -> Zone. Ensuite, Visual Studio aurait pris soin de configurer correctement la zone.

Paul Syfrett
la source
2
+1 ... Je viens de remarquer que pour une raison quelconque, web.config n'était pas inclus, heureux d'avoir trouvé votre réponse pour résoudre mon problème
pollirrata
2
Je me rends compte que c'est vieux, mais j'ai en fait eu le même problème aujourd'hui, alors je voulais dire merci pour cette réponse. :)
Ricky Mutschlechner
J'ai eu le même problème aussi, et la solution similaire. Je faisais Views/Web.configréférence à la System.Web.Mvc.MvcWebRazorHostFactoryversion 5.0.0.0, et j'avais une zone tierce faisant référence à la v4.0 et avec les vues coopérant. Je suis Views/Web.configrevenu à la v4.0 et tout a fonctionné.
Codes avec Hammer le
c'était spécifiquement votre commentaire sur l'écrasement du fichier web.config par celui du dossier Views qui m'a aidé à résoudre ce problème. simplement rendre le contenu exactement le même ne fonctionne pas pour une raison insensée. AAARRRGGGHHH! ;)
Ryan Vettese
Dans mon cas, j'utilise robocopy pour synchroniser la version locale avec la version du serveur, exclu tous les fichiers web.config. sans fichier web.config dans la version serveur, cette erreur apparaîtra.
Will Wu
11

Si vos vues sont dans un assemblage de bibliothèque de classes, ce qui est utile pour la réutilisation des vues partagées entre les projets, faire ce qu'Adam suggère peut ne pas suffire. J'avais encore des problèmes même avec ça.

Essayez ceci dans votre web.config à la racine de votre projet:

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

Et ceci dans le web.config dans votre dossier vues:

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

Cela a fonctionné pour moi. J'ai maintenant intellisense et aucune erreur de compilation sur mes vues dans un projet non MVC que je peux ensuite référencer à partir de plusieurs sites Web MVC.

Greg Jackman
la source
1
S'agit-il des fichiers web.config de votre projet Web ou des fichiers web.config de votre bibliothèque de classes?
theJerm
7

J'ai rencontré ce problème lorsque j'ai eu par inadvertance une copie du fichier de vue (About.cshtml) pour la route / about dans le répertoire racine. (Pas le dossier views) Une fois que j'ai déplacé le fichier hors de la racine, le problème a disparu.

James Lawruk
la source
1
Je vous remercie! Je viens de devenir fou avec le même problème et c'était la réponse ;-)
Rob
Cool! Je me souviens aussi être devenu fou. :)
James Lawruk
J'avais des fichiers .cshtml dans un dossier du répertoire racine, ce qui a provoqué l'échec du seul dossier de mes vues ... while (true) {bashHeadToWall; }. Merci.
matt.j.crawford
7

Eu des problèmes similaires en utilisant VS2012 et VS2013.
L'ajout de la ligne suivante à <appSettings> dans le web.config principal a fonctionné:

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

Si la ligne était déjà là mais disait 2.0.0.0, la changer en 3.0.0.0 fonctionnait.


la source
C'était aussi mon problème après avoir effectué une mise à niveau MVC. Il a dit 2.0.0.0, lors du passage à 3, cela a fonctionné.
FerX32
6

Mise à jour: 5/5/2015 Pour votre projet MVC 5, vous devez définir la version sur 5.0.0.0 dans votre /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
la source
1
Yup a trouvé la version 5.2.0.0 qui est à l'origine du problème, mais le changer en 5.0.0.0 l'a corrigé !!! Merci.
vendettamit
5

Pendant que vous déclarez le modèle en haut de la vue en utilisant un code comme celui-ci:

@model MyModel

vous devez mettre en majuscule vos références ci-dessous, par exemple:

@Html.Encode(Model.MyDisplayValue)

Je crois qu'un web.config manquant dans le dossier Views en serait la cause principale, mais si cela est résolu et que le problème persiste, vérifiez que vous utilisez Model , pas model pour y faire référence dans la source.

Bork Blatt
la source
1
Cela résout l'erreur lorsque le problème est que vous essayez de référencer votre modèle dans votre propre code dans la vue, comme lorsque vous créez votre propre assistant qui ne repose pas sur des expressions lambda, etc.
JohnC
3

J'ai également rencontré ce problème. Ma situation était un peu différente.

  1. Un de mes dossiers de vue a été accidentellement déplacé vers le répertoire racine de mon projet. Cela a conduit à la project_root/SignUp/ViewNamecorrespondance d' itinéraire avant project_root/Views/SignUp/ViewName. Cela a causé l' @modelerreur.

  2. Après avoir replacé les vues à l'emplacement approprié, le répertoire a été en quelque sorte recréé à la racine du projet. Cette fois, vide. /SignUp/ViewNametravaillé, mais a /SignUp/jeté une 403 - Forbidden: Access is denied.erreur. Le dossier entier doit être supprimé de la racine du projet.

J'espère que ça aidera quelqu'un. J'ai passé des heures à croire que le problème était causé par notre récente mise à niveau de MVC 3 vers MVC 4. Juste une remarque: les problèmes de mise à niveau ne devraient se produire qu'entre MVC 2 et MVC 3. Si vous voyez ce problème sur les versions ultérieures, ce n'est probablement pas dû au améliorer.


la source
2

Il m'a fallu des siècles pour résoudre ce problème, mais j'espère finalement l'avoir résolu sur MVC, c'est similaire:

J'ai réinstallé ASP.NET 4.5 ( http://www.asp.net/downloads )

J'ai suivi le tutoriel de mise à niveau sur http://www.asp.net/whitepapers/mvc4-release-notes

MAIS ce paragraphe mentionné est faux pour moi

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

Parce que j'ai Razor dans System.Web.Razor , j'ai donc changé l'espace de noms de rasoir en System.Web.Razor.

Ajoutez ceci à votre web.config

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

J'ai ajouté la référence d'assemblage à tous ces assemblages ci-dessus

Recherchez l'élément ProjectTypeGuids et remplacez {E53F8FEA-EAE0-44A6-8774-FFD645390401} par {E3E379DF-F4C6-4180-9B81-6769533ABE47}.

C'est tout.

Tomas Kubes
la source
1
L'ajout d'applications à webconfig l'a résolu pour moi. Bien que je pense que <add key="webpages:Version" value="2.0.0.0" />c'est le facteur déterminant, l'autre paramètre n'est pas nécessaire.
Chaussure
1
pour MVC 5 cela doit être 3.0.0.0mais oui c'est très important!
Simon_Weaver
2

C'est une horrible erreur mais:

Assurez-vous que vous avez des fichiers Web.config dans votre View at Remote . Peut-être que vous avez sauté pour le télécharger par les filtres de votre programme Ftp.

Pcodea Xonos
la source
2

Il me manquait web.config sous Areas / MyArea / Views / web.config. Une fois ajouté, cela fonctionnait bien. C'était avec MVC 5 et .NET4.5

Victor
la source
Le mien manquait également, avec l'aide de ce site, je l'ai fait fonctionner à nouveau. forums.asp.net/t/…
Perposterer
0

Il y a aussi une autre raison. Dans mon cas, j'avais copié un fichier index.cshtml dans le dossier racine Web (en dehors du dossier Views) en tant que sauvegarde à partir du serveur distant.

Donc, j'ai continué à changer mon /views/web.config, j'ai continué à changer mon /views/home/index.cshtml et l'erreur a continué à se produire ... jusqu'à ce que je découvre le /index.cshtml en dehors du dossier de vues, je l'ai supprimé et bien sûr, il tout est revenu à la normale!

Nestor
la source
0

J'ai rencontré le même problème, mais dans mon cas, la seule chose qui avait changé est que j'avais désinstallé Visual Studio 2012 et installé Visual Studio 2013. J'ai ouvert notre solution, mais j'ai continué à obtenir la même The name 'model' does not exist in current contexterreur dans chaque vue Razor.

Mon collègue a suggéré de vérifier les mises à jour pour VS2013. Après avoir installé la mise à jour 1 de VS2013 , j'ai cessé de recevoir cette erreur.

John Washam
la source
1
J'obtiens cette erreur avec VS2013 Update 2 . Avec la mise à jour 1, cela fonctionnait bien. Je n'ai pas encore été en mesure de trouver une solution à cela. J'ai tenté de désinstaller la mise à jour 2, mais cela a entraîné le blocage de VS après l'ouverture d'un fichier cshtml.
iheartcsharp
J'ai le même problème avec VS2013 Update 2.
EricP
0

Vérifiez votre fichier de configuration dans le répertoire des vues. dans l'ajout de la clé pour MVC 4/5

sansalk
la source
0

La réinstallation de la pépite l'a résolu pour moi

PM> Package d'installation Microsoft.AspNet.Razor -Version 3.2.3

pixelagent
la source
0

Pour moi, c'était le problème. Ce bloc entier était absent de la section.

  <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
la source
0

J'ai le même problème après la mise à jour des packages. J'ai fait tout ce que vous avez écrit ci-dessus dans cette rubrique, mais le sous-jacent rouge du mot-clé model n'a pas disparu. Plus tard, solution trouvée: je viens de supprimer le dossier `` package '' du répertoire de mon projet et de le reconstruire, en attendant autorisé NuGet à restaurer les packages manquants. Rafraîchie, et c'est fait!

Peter.k
la source
0

Vérifiez que votre fichier web.config doit exister dans les fichiers publiés

Arash Farahani
la source
0

J'étais confronté au même problème et ensuite je trouve une solution. La solution est:

  1. Fermer Visual Studio
  2. Supprimer le fichier SUO
  3. Redémarrez Visual Studio

Le fichier .suo est un fichier caché dans le même dossier où se trouve le fichier de solution .svn . J'espère que ça marchera!

Arsman Ahmad
la source