Il nome "ViewBag" non esiste nel contesto corrente


89

Sto cercando di utilizzare ViewBag nella mia applicazione, ho tutte le DLL recenti, l'ultima versione di MVC 3, ma ancora ricevo l'errore:

"Il nome" ViewBag "non esiste nel contesto corrente"

Ho persino disinstallato e reinstallato MVC 3 e tuttavia non ci sono modifiche.

Inoltre, non credo che le DLL vengano visualizzate nel GAC.

Quale potrebbe essere il mio problema? O come aggiungere le DLL al GAC?


1
Tieni presente che per 5.2.2.0 web.config dovrebbe puntare a 5.2.2.0 ma Views / web.config a 5.1.0.0 per assembly MVC
Bart Calixto

Risposte:


39

Devi aggiungere la configurazione Razor specifica di MVC al tuo file web.config. Vedere qui: Razor HtmlHelper Extensions (o altri spazi dei nomi per le visualizzazioni) Not Found

Usa lo strumento di aggiornamento MVC 3 per assicurarti automaticamente di avere i valori di configurazione corretti.


Grazie! Quel collegamento ha aiutato! Immagino che questo sia tutto il risultato della creazione di un sito che era su MVC 3 Beta, e quindi quando ottieni l'ultima versione, le configurazioni web non vengono modificate. Grazie!
efleming

Ho aggiornato il mio post con questo e una correzione correlata: stevesmithblog.com/blog/…
ssmith

È possibile utilizzare lo strumento di aggiornamento (vedere la risposta aggiornata) per assicurarsi che la configurazione sia corretta.
marcind

3
Solo una nota: se hai posizioni di visualizzazione aggiuntive, ad esempio, al di fuori della ~/Viewsposizione normale , copia anche ~/Views/Web.configin quella posizione.
dave thieben

83

Avevo lo stesso problema. Si è scoperto che mi mancava il ./Views/Web.configfile, perché ho creato il progetto da un'applicazione ASP.NET vuota invece di utilizzare un modello ASP.NET MVC.

Per ASP.NET MVC 5, un ./Views/Web.configfile vanilla contiene quanto segue:

<?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'aggiunta di un ./Views/Web.configfile contenente questo contenuto ha risolto questo problema per me.


3
Finalmente la soluzione. Non ho distribuito il file /Views/Web.config sul server e quel file mancante era la causa dell'errore.
Stack Man

2
è tornato e ha utilizzato questa soluzione una seconda volta! :)
user230910

2
Dopo aver sprecato più di un giorno cercando di capirlo, questo ha fatto per me. Grazie. L'unica cosa che dovevo aggiungere al tag <namespaces> in "./Views/Web.config era; <add namespace="System.Web.Optimization"/>
dunwan

nel mio caso, per qualche motivo gli elementi non erano nella root web.config ma sono stati aggiunti a un web.config sotto 'Views' quando ho creato un layout MVC5. Ho migrato gli elementi alla radice web.config e cancellato il web.config 'extra' (??)
JDPeckham

2
Amico, Dio ti benedica per questo. Ero ESTREMAMENTE infastidito da questo.
Dragan B.

19

Prova a pulire e ricostruire. Ha funzionato nel mio caso.


Non posso credere di aver perso tempo chiedendomi cosa c'era di sbagliato nel mio codice ... grazie ha funzionato
Mr_Hmp

esasperante che funzioni ... mi dimentico sempre di farlo e spreco così tanto tempo ... non dovrebbe essere necessario
TCC

nel mio caso ho dovuto eliminare la cartella dei pacchetti dalla soluzione e fare una pulizia
Nerdroid

9

Ho avuto lo stesso problema in una soluzione che era stata aggiornata a MVC 5 in Visual Studio 2015.

Nel file web.config all'interno della cartella Views (non nella root web.config), ho aggiornato il numero di versione a cui si fa riferimento <configSections>da 2.0.0.0a 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
Grazie mille! Questa roba della versione è pazzesca. Ogni volta che mi giro, gli aggiornamenti di MS sono uno sopra l'altro. Ling to SQL è sostituito da Entity Framework, MVC è passato da 1 a 6 e così via.
JustJohn

Grazie, ho risolto il mio problema con VS2017.
QuickNull

Risolto il problema con l'app VS 2019 mvc 5.
MrDywar

6

Dopo aver provato cose diverse, si scopre che era VS cache. Puoi risolverlo eliminando i file della cache che si trovano in:

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

Ho chiuso il mio progetto, eliminato i file su quel percorso e riaperto il mio progetto, ho pulito la soluzione e lo ho ricostruito e il problema è stato risolto

I file verranno ricreati al successivo avvio di Visual Studio


Questo ha funzionato anche per me nella v15 (VS 2017). Probabilmente non avrei mai pensato di farlo ... grazie per il grande risparmio di tempo, Wilson & Silver!
Paul Schroeder

Percorso universale%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache
fiat

3

Ho avuto lo stesso problema e crimbo mi ha dato l'indizio giusto, è stato causato dal file ./Views/Web.config che era presente ma non conteneva gli spazi dei nomi giusti immagino ...

Ho creato un progetto MVC5 vuoto e ho importato il suo ./Views/Web.config nel mio progetto esistente e le onde rosse sotto ogni utilizzo di ViewBag sono sparite!


Visual Studio 2013, progetto web vuoto creato con casella MVC selezionata. Crea la struttura di tutti i file con riferimenti minimi allo spazio dei nomi MVC. Ho aggiunto un semplice controller e visualizzazione. Ho ricevuto errori di compilazione "Il tipo o il nome dello spazio dei nomi" Ajax "non esiste nello spazio dei nomi" System.Web.Mvc "(manca un riferimento all'assembly)". File Editor mostra anche l'avviso "Il nome" ViewBag "non esiste nel contesto corrente". Vai a Riferimenti al progetto, trova System.Web.Mvc, imposta la copia locale su true. pulire la build e ricostruire, ha risolto il mio problema.
Kagan Agun


2

Avevo un ./Views/Web.Configfile ma questo errore si è verificato dopo la pubblicazione del sito. Risulta che la proprietà dell'azione di compilazione sul file era impostata su Noneinvece di Content. Modificandolo per Contentconsentire alla pubblicazione di funzionare correttamente.


1

Ho riscontrato questo problema dopo aver modificato lo spazio dei nomi predefinito dell'applicazione nella finestra di dialogo Proprietà.

./Views/Web.Config conteneva un riferimento al vecchio spazio dei nomi


Sì, e fornisce un messaggio di errore nel posto completamente sbagliato .. vale la pena controllare se esistono tutti gli spazi dei nomi a cui si fa riferimento in TUTTI i file web.config - Avevo un vecchio spazio dei nomi nel file web / config dell'area che causava molti problemi
user230910

1

Nel mio caso, la modifica della pagina Web: Versione sul valore corretto ha risolto il mio problema, per me il valore corretto era (2.0.0.0 invece di 3.0.0.0):

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

1

Dopo aver provato tutti gli approcci, nessuno di loro ha funzionato per me poiché tutto ciò che avevo erano le configurazioni corrette. finalmente

L'eliminazione di tutti i file da "temp" e "% temp%" dal sistema ha aiutato a risolvere questo problema.

Apri il comando Esegui (Windows + R) e digita le stringhe sopra ed elimina tutti i file temporanei.


Grazie! Dopo aver provato tutto, ha funzionato per me.
user390480

1

Se hai provato tutte le risposte disponibili e ancora non riesci a trovare la risposta, questo potrebbe risolvere il problema. Se hai diverse configurazioni di soluzioni come Debug, Release ecc., Imposta il percorso di output del progetto su "bin" e compila il progetto. Ripristina la modifica dopo la compilazione.

Percorso di output del progetto

VS cerca le DLL nella cartella bin


1

Avevo già provato a eliminare il file bin e obj e a riavviare VS e non ho avuto fortuna.

Ho anche avuto questo problema molte volte ed è un problema risolverlo ogni volta. Spesso è dovuto al fatto che il file web.config non ha la versione corretta di uno dei riferimenti. Ciò significa fare clic sul riferimento in Visual Studio per vedere la versione nella scheda delle proprietà, quindi associarla alla versione nei file web.config.

Un altro modo è (se possibile) eseguire l'aggiornamento a una versione successiva del framework .net, quindi eliminare i file bin / obj e riavviare Visual Studio. Posso solo presumere che stia cambiando qualcosa nel file

Un rapido controllo della differenza tra il file csproj in realtà non mostra alcuna differenza importante ... Ma le differenze che ha mostrato erano (ho aggiunto (rimosso) per mostrare la vecchia riga)

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

Nel file Web.Config (non quello in Visualizza)

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

Ha anche aggiunto (allo stesso file web.config) ma l'ho rimosso 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>

Infine, nella console di Gestione pacchetti, aggiungi update-package

Esegui il sito web localmente e vedi eventuali errori di compilazione che sono stati corretti dal mio secondo paragrafo (corrispondenti alle versioni dei riferimenti)


0

Ho aggiornato le pagine web: versione sotto nella cartella ./Views/Web.Config ma questa impostazione era presente anche in web.config in root. Aggiorna entrambi o rimuovi da root web.config


0

Come già menzionato da @Wilson Vallecilla. Si prega di eseguire i passaggi seguenti per eliminare la cache:

Segui il percorso sottostante per scoprire i file:

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

Elimina tutti e quattro i file:

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

Ho chiuso il mio progetto, eliminato i file su quel percorso e riaperto il mio progetto, ho pulito la soluzione e lo ho ricostruito e il problema è stato risolto

Anche l'eliminazione dei file temporanei ASP.NET aiuta. C: \ Users \ your.name.here \ AppData \ Local \ Temp \ Temporary ASP.NET Files.

Questo funziona per me.

Grazie!


0

Per MVC5, nel caso in cui si stia creando un'applicazione da zero. È necessario aggiungere un file web.config alla cartella Views e incollare il codice seguente al suo interno.

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

Nota che per MVC 3 dovrai cambiare la versione a 3.0.0.0 in

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

Potrebbe essere necessario chiudere e aprire nuovamente la pagina * .cshtml per visualizzare le modifiche.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.