Le nom 'ViewBag' n'existe pas dans le contexte actuel

89

J'essaie d'utiliser ViewBag dans mon application, j'ai toutes les dll récentes, la dernière version de MVC 3, mais j'obtiens toujours l'erreur:

"Le nom 'ViewBag' n'existe pas dans le contexte actuel"

J'ai même désinstallé puis réinstallé MVC 3 et pourtant il n'y a pas de changement.

De plus, je ne crois pas que les DLL apparaissent dans le GAC.

Quel pourrait être mon problème? Ou comment ajouter les DLL au GAC?

éblouissant
la source
1
Gardez à l'esprit que pour 5.2.2.0, le web.config doit pointer vers 5.2.2.0 mais Views / web.config vers 5.1.0.0 pour l'assemblage MVC
Bart

Réponses:

39

Vous devez ajouter la configuration Razor spécifique à MVC à votre web.config. Voir ici: Razor HtmlHelper Extensions (ou autres espaces de noms pour les vues) non trouvés

Utilisez l' outil de mise à niveau MVC 3 pour vous assurer automatiquement que vous avez les bonnes valeurs de configuration.

Marcind
la source
Merci! Ce lien a aidé! Je suppose que tout cela est le résultat de la création d'un site qui était sur la version bêta de MVC 3, puis lorsque vous obtenez la dernière version, les configurations Web ne sont pas modifiées. Merci!
efleming le
J'ai mis à jour mon message avec ceci ainsi qu'un correctif connexe: stevesmithblog.com/blog/…
ssmith
Vous pouvez utiliser l'outil de mise à niveau (voir la réponse mise à jour) pour vous assurer que votre configuration est correcte.
marcind
3
Juste une remarque: si vous avez des emplacements de vue supplémentaires, c'est-à-dire en dehors de l' ~/Viewsemplacement normal , copiez également le ~/Views/Web.configà cet emplacement.
dave thieben
83

J'avais le même problème. Il s'est avéré que je manquais le ./Views/Web.configfichier, car j'ai créé le projet à partir d'une application ASP.NET vide au lieu d'utiliser un modèle ASP.NET MVC.

Pour ASP.NET MVC 5, un ./Views/Web.configfichier vanilla contient les éléments suivants:

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

L'ajout d'un ./Views/Web.configfichier contenant ce contenu a résolu ce problème pour moi.

crimbo
la source
3
Solution enfin. Je n'ai pas déployé le fichier /Views/Web.config sur le serveur et ce fichier manquant était la cause de l'erreur.
Stack Man
2
est revenu et a utilisé cette solution une 2ème fois! :)
user230910
2
Après avoir perdu plus d'une journée à essayer de le comprendre, cela l'a fait pour moi. Merci. La seule chose que j'avais besoin d'ajouter à la balise <namespaces> dans "./Views/Web.config était; <add namespace="System.Web.Optimization"/>
dunwan
dans mon cas, pour une raison quelconque, les éléments n'étaient pas dans le web.config racine mais ont été ajoutés à un web.config sous «Vues» lorsque j'ai créé une mise en page MVC5. J'ai migré les éléments vers la racine web.config et supprimé le 'extra' (??) web.config
JDPeckham
2
Mec, que Dieu vous bénisse pour cela. J'étais EXTRÊMEMENT ennuyé par cela.
Dragan B.
19

Essayez de nettoyer et de reconstruire. Cela a fonctionné dans mon cas.

Ruwan Jayalath
la source
Je ne peux pas croire que j'ai perdu mon temps à me demander ce qui n'allait pas avec mon code ... merci, cela a fonctionné
Mr_Hmp
exaspérant que cela fonctionne ... j'oublie toujours de faire cela et perdre tellement de temps ... ne devrait pas être nécessaire
TCC
dans mon cas, j'ai dû supprimer le dossier packages de la solution et faire un nettoyage
Nerdroid
9

J'ai eu le même problème dans une solution qui avait été mise à niveau vers MVC 5 dans Visual Studio 2015.

Dans le fichier web.config dans le dossier Views (pas dans la racine web.config), j'ai mis à jour le numéro de version référencé dans <configSections>de 2.0.0.0à 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>
Jon Crowell
la source
2
Merci beaucoup! Ce truc de version est fou. Chaque fois que je me retourne, les mises à niveau MS sont partout. Ling to SQL est remplacé par Entity Framework, MVC est passé de 1 à 6, encore et encore.
JustJohn
Merci, j'ai corrigé mon problème avec VS2017.
QuickNull
Correction de l'application VS 2019 mvc 5.
MrDywar
6

Après avoir essayé différentes choses, il s'est avéré que c'était le cache VS. Vous pouvez le résoudre en supprimant les fichiers de cache situés dans:

C: \ Users \ votre.nom.ici \ AppData \ Local \ Microsoft \ VisualStudio \ 14.0 \ ComponentModelCache

J'ai fermé mon projet, supprimé les fichiers sur ce chemin et rouvert mon projet, nettoyé la solution et l'ai reconstruite et le problème a été résolu

Les fichiers seront recréés lors du prochain lancement de Visual Studio

Wilson Vallecilla
la source
Cela a également fonctionné pour moi dans la v15 (VS 2017). Je n'aurais probablement jamais pensé faire cela ... merci pour un gain de temps considérable, Wilson & Silver!
Paul Schroeder
Chemin universel%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache
fiat
3

J'ai eu le même problème et crimbo m'a donné le bon indice, il a été causé par le fichier ./Views/Web.config qui était présent mais ne contenant pas les bons espaces de noms je suppose ...

J'ai créé un projet MVC5 vierge et importé son ./Views/Web.config dans mon projet existant et les ondes rouges sous chaque utilisation de ViewBag ont disparu!

JJP
la source
Visual Studio 2013, a créé un projet Web vierge avec la case MVC cochée. Il crée la structure de tous les fichiers avec des références d'espace de noms MVC minimales. J'ai ajouté un contrôleur et une vue simples. J'ai eu des erreurs de compilation "Le type ou le nom d'espace de noms 'Ajax' n'existe pas dans l'espace de noms 'System.Web.Mvc' (il vous manque une référence d'assemblage)". L'éditeur de fichiers affiche également l'avertissement "Le nom 'ViewBag' n'existe pas dans le contexte actuel". Accédez aux références de projet, recherchez System.Web.Mvc, définissez la copie locale sur true. nettoyer la construction et reconstruire, cela a résolu mon problème.
Kagan Agun
2

J'avais un ./Views/Web.Configfichier mais cette erreur s'est produite après la publication du site. Il s'avère que la propriété d'action de génération du fichier a été définie sur au Nonelieu de Content. Changer cela pour Contentpermettre à la publication de fonctionner correctement.

Kcoder
la source
1

J'ai eu ce problème après avoir modifié l'espace de noms par défaut de l'application dans la boîte de dialogue Propriétés.

Le ./Views/Web.Config contenait une référence à l'ancien espace de noms

csharpsql
la source
Oui, et cela donne un message d'erreur au mauvais endroit .. cela vaut la peine de vérifier si tous les espaces de noms existent et qui sont référencés dans TOUS les fichiers web.config - j'avais un ancien espace de noms dans le fichier web / config de la zone causant de nombreux problèmes
user230910
1

Dans mon cas, changer la page Web: Version à la valeur appropriée a résolu mon problème, pour moi la valeur correcte était (2.0.0.0 au lieu de 3.0.0.0):

<appSettings>
        <add key="webpages:Version" value="2.0.0.0"/>
        <add key="webpages:Enabled" value="false"/>
Robin Leblond
la source
1

Après avoir essayé toutes les approches, aucune d'elles n'a fonctionné pour moi car je n'ai que des configurations correctes. enfin

La suppression de tous les fichiers de «temp» et «% temp%» du système a permis de résoudre ce problème.

Ouvrez la commande Exécuter (Windows + R) et tapez les chaînes ci-dessus et supprimez tous les fichiers temporaires.

Champ
la source
Je vous remercie! Après avoir tout essayé, cela a fonctionné pour moi.
user390480
1

Si vous avez essayé toutes les réponses disponibles et que vous ne trouvez toujours pas la réponse, cela peut résoudre le problème. Si vous avez différentes configurations de solutions telles que Debug, Release, etc., définissez le chemin de sortie du projet sur «bin» et compilez le projet. Annuler la modification après la compilation.

Chemin de sortie du projet

VS recherche les dll dans le dossier bin

Naga Sailesh
la source
1

J'avais déjà essayé de supprimer le fichier bin et obj et de redémarrer VS et je n'avais pas de chance.

J'ai également eu ce problème à plusieurs reprises et c'est difficile à résoudre à chaque fois. Cela est souvent dû au fait que le fichier web.config n'a pas la version correcte de l'une des références. Cela signifie que cliquez sur la référence dans Visual Studio pour voir la version dans l'onglet des propriétés, puis faites-la correspondre à la version dans les fichiers web.config.

Une autre méthode consiste (si possible) à mettre à niveau vers une version ultérieure du framework .net, puis à supprimer les fichiers bin / obj et à redémarrer Visual Studio. Je ne peux que supposer que cela change quelque chose dans le

Une vérification rapide de la différence entre le fichier csproj ne montre en fait aucune différence majeure ... Mais les différences qu'il a montrées étaient (j'ai ajouté (supprimer) pour afficher l'ancienne ligne)

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

Dans le fichier Web.Config (pas celui de View)

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

Il a également ajouté (au même fichier web.config) mais je l'ai supprimé manuellement

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

Enfin, dans la console du gestionnaire de packages, ajoutez update-package

Exécutez le site Web localement et voyez toutes les erreurs de compilation corrigées par mon deuxième paragraphe (correspondant aux versions des références)

Dave
la source
0

J'ai mis à jour les pages Web: Version sous dans le dossier ./Views/Web.Config mais ce paramètre était également présent dans web.config à la racine. Mettre à jour les deux ou supprimer de la racine web.config

user1412699
la source
0

Comme @Wilson Vallecilla l'a déjà mentionné. Veuillez suivre les étapes ci-dessous pour supprimer le cache:

Veuillez suivre le chemin ci-dessous pour découvrir les fichiers:

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

Supprimez les quatre fichiers:

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

J'ai fermé mon projet, supprimé les fichiers sur ce chemin et rouvert mon projet, nettoyé la solution et l'ai reconstruite et le problème a été résolu

La suppression de vos fichiers ASP.NET temporaires aide également. C: \ Users \ votre.nom.ici \ AppData \ Local \ Temp \ Temporary ASP.NET Files.

Cela fonctionne pour moi.

Merci!

Trilok Pathak
la source
0

Pour MVC5, au cas où vous construisez une application à partir de zéro. Vous devez ajouter un fichier web.config dans le dossier Views et y coller le code suivant.

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

Notez que pour MVC 3, vous devrez changer de version en 3.0.0.0 à

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

Vous devrez peut-être fermer et ouvrir à nouveau la page * .cshtml pour voir les modifications.

Ashish Kaul
la source