El nombre 'ViewBag' no existe en el contexto actual

89

Estoy tratando de usar ViewBag en mi aplicación, tengo todas las dlls recientes, la última versión de MVC 3, pero todavía recibo el error:

"El nombre 'ViewBag' no existe en el contexto actual"

Incluso he desinstalado y vuelto a instalar MVC 3 y, sin embargo, no hay cambios.

Además, no creo que los dll aparezcan en el GAC.

Cual puede ser mi problema? ¿O cómo agregar los dll al GAC?

brillante
fuente
1
Tenga en cuenta que para 5.2.2.0, web.config debe apuntar a 5.2.2.0 pero Views / web.config a 5.1.0.0 para el ensamblaje MVC
Bart Calixto

Respuestas:

39

Debe agregar la configuración de Razor específica de MVC a su web.config. Vea aquí: Extensiones Razor HtmlHelper (u otros espacios de nombres para vistas) no encontradas

Utilice la herramienta de actualización MVC 3 para asegurarse automáticamente de tener los valores de configuración correctos.

maridar
fuente
¡Gracias! ¡Ese enlace ayudó! Supongo que todo esto es el resultado de crear un sitio que estaba en MVC 3 Beta, y luego, cuando obtienes la última versión, las configuraciones web no se modifican. ¡Gracias!
brillante
Actualicé
ssmith
Puede utilizar la herramienta de actualización (consulte la respuesta actualizada) para asegurarse de que su configuración sea correcta.
marcind
3
Solo una nota: si tiene ubicaciones de vista adicionales, es decir, fuera de la ~/Viewsubicación normal , copie también ~/Views/Web.configen esa ubicación.
Dave Thieben
83

Estaba teniendo el mismo problema. Resultó que me faltaba el ./Views/Web.configarchivo, porque creé el proyecto desde una aplicación ASP.NET vacía en lugar de usar una plantilla ASP.NET MVC.

Para ASP.NET MVC 5, un ./Views/Web.configarchivo vanilla contiene lo siguiente:

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

Agregar un ./Views/Web.configarchivo con este contenido solucionó este problema.

crimbo
fuente
3
Solución al fin. No implementé el archivo /Views/Web.config en el servidor y ese archivo faltante fue la causa del error.
Stack Man
2
regresó y usó esta solución por segunda vez! :)
user230910
2
Después de perder más de un día tratando de resolverlo, esto lo hizo por mí. Gracias. Lo único que necesitaba agregar a la etiqueta <namespaces> en "./Views/Web.config era; <add namespace="System.Web.Optimization"/>
dunwan
en mi caso, por alguna razón, los elementos no estaban en la raíz web.config pero se agregaron a un web.config en 'Vistas' cuando creé un diseño MVC5. Migré los elementos a la raíz web.config y eliminé el 'extra' (??) web.config
JDPeckham
2
Amigo, Dios te bendiga por esto. Estaba EXTREMADAMENTE molesto por esto.
Dragan B.
19

Intente limpiar y reconstruir. Funcionó en mi caso.

Ruwan Jayalath
fuente
No puedo creer que perdí el tiempo preguntándome qué estaba mal con mi código ... gracias, funcionó
Mr_Hmp
exasperante que esto funcione ... siempre me olvido de hacer esto y pierdo tanto tiempo ... no debería ser necesario
TCC
en mi caso, tuve que eliminar la carpeta de paquetes de la solución y hacer una limpieza
Nerdroid
9

Tuve el mismo problema en una solución que se había actualizado a MVC 5 en Visual Studio 2015.

En el archivo web.config dentro de la carpeta Vistas (no la raíz web.config), actualicé el número de versión al que se hace referencia en <configSections>de 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>
Jon Crowell
fuente
2
¡Muchas gracias! Esta versión es una locura. Cada vez que doy la vuelta, las actualizaciones de MS se superponen entre sí. Ling to SQL es reemplazado por Entity Framework, MVC ha pasado de 1 a 6, una y otra vez.
JustJohn
Gracias, solucioné mi problema con VS2017.
QuickNull
Se corrigió la aplicación VS 2019 mvc 5.
MrDywar
6

Después de probar diferentes cosas, resulta que era VS cache. Puede resolverlo eliminando los archivos de caché ubicados en:

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

Cerré mi proyecto, eliminé los archivos en esa ruta y volví a abrir mi proyecto, limpié la solución y la construí de nuevo y el problema se resolvió

Los archivos se volverán a crear la próxima vez que inicie Visual Studio.

Wilson Vallecilla
fuente
Esto también funcionó para mí en v15 (VS 2017). Probablemente nunca hubiera pensado en hacer esto ... ¡gracias por un gran ahorro, Wilson & Silver!
Paul Schroeder
Ruta universal%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache
fiat
3

Tuve el mismo problema y crimbo me dio la pista correcta, fue causado por el archivo ./Views/Web.config que estaba presente pero no contiene los espacios de nombres correctos, supongo ...

¡Creé un proyecto MVC5 en blanco e importé su ./Views/Web.config en mi proyecto existente y las ondas rojas debajo de cada uso de ViewBag desaparecieron!

JJP
fuente
Visual Studio 2013, proyecto web en blanco creado con la casilla MVC marcada. Crea toda la estructura de archivos con referencias mínimas al espacio de nombres MVC. Agregué un controlador y una vista simples. Obtuve errores de compilación "El tipo o nombre del espacio de nombres 'Ajax' no existe en el espacio de nombres 'System.Web.Mvc' (¿le falta una referencia de ensamblaje)". El Editor de archivos también muestra la advertencia "El nombre 'ViewBag' no existe en el contexto actual". Vaya a Referencias del proyecto, busque System.Web.Mvc, establezca la copia local en verdadero. limpiar la construcción y reconstruir, resolvió mi problema.
Kagan Agun
2

Tenía un ./Views/Web.Configarchivo, pero este error ocurrió después de publicar el sitio. Resulta que la propiedad de acción de compilación en el archivo se estableció en en Nonelugar de Content. Cambiar esto para Contentpermitir que la publicación funcione correctamente.

Kcoder
fuente
1

Tuve este problema después de cambiar el espacio de nombres predeterminado de la aplicación en el cuadro de diálogo Propiedades.

./Views/Web.Config contenía una referencia al antiguo espacio de nombres

csharpsql
fuente
Sí, y da un mensaje de error en el lugar completamente incorrecto ... vale la pena verificar si existen todos los espacios de nombres a los que se hace referencia en TODOS los archivos web.config: tenía un espacio de nombres antiguo en el archivo web / config del Área que causaba muchos problemas
user230910
1

En mi caso, cambiar la página web: Versión al valor adecuado resolvió mi problema, para mí el valor correcto era (2.0.0.0 en lugar de 3.0.0.0):

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

Después de probar todos los enfoques, ninguno de ellos funcionó para mí, ya que todo lo que tengo eran configuraciones correctas. finalmente

Eliminar todos los archivos de "temp" y "% temp%" del sistema ayudó a resolver este problema.

Abra el comando Ejecutar (Windows + R) y escriba las cadenas anteriores y elimine todos los archivos temporales.

Morder
fuente
¡Gracias! Después de probar todo, esto funcionó para mí.
user390480
1

Si ha probado todas las respuestas disponibles y aún no puede encontrar la respuesta, esto podría resolver el problema. Si tiene diferentes configuraciones de soluciones como Debug, Release, etc., establezca la ruta de salida del proyecto en 'bin' y compile el proyecto. Revertir el cambio después de compilar.

Ruta de salida del proyecto

VS busca dlls en la carpeta bin

Naga Sailesh
fuente
1

Ya había intentado eliminar el archivo bin y obj y reiniciar VS y no tuve suerte.

También he tenido este problema muchas veces y es un dolor resolverlo cada vez. A menudo se debe a que el archivo web.config no tiene la versión correcta de una de las referencias. Esto significa hacer clic en la referencia en Visual Studio para ver la versión en la pestaña de propiedades y luego hacerla coincidir con la versión en los archivos web.config.

Otra forma es (si es posible) actualizar a una versión posterior del marco .net y luego eliminar los archivos bin / obj y reiniciar Visual Studio. Solo puedo asumir que está cambiando algo en el

Una verificación rápida de la diferencia entre el archivo csproj en realidad no muestra ninguna diferencia importante ... Pero las diferencias que mostró fueron (agregué (eliminar) para mostrar la línea anterior)

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

En el archivo Web.Config (no en el de Ver)

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

También se agregó (al mismo archivo web.config) pero lo eliminé 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, en Package Manager Console, agregue update-package

Ejecute el sitio web localmente y vea los errores de compilación que se corrigieron en mi segundo párrafo (que coinciden con las versiones de las referencias)

Dave
fuente
0

Actualicé las páginas web: Versión en la carpeta ./Views/Web.Config, pero esta configuración también estaba presente en web.config en la raíz. Actualice ambos o elimínelos de la raíz web.config

usuario1412699
fuente
0

Como ya mencionó @Wilson Vallecilla. Siga los pasos a continuación para eliminar la caché:

Siga la ruta a continuación para descubrir los archivos:

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

Elimina los cuatro archivos:

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

Cerré mi proyecto, eliminé los archivos en esa ruta y volví a abrir mi proyecto, limpié la solución y la construí de nuevo y el problema se resolvió

Eliminar sus archivos ASP.NET temporales también ayuda. C: \ Users \ your.name.here \ AppData \ Local \ Temp \ Temporary ASP.NET Files.

Esto funciona para mi.

¡Gracias!

Trilok Pathak
fuente
0

Para MVC5, en caso de que esté creando una aplicación desde cero. Debe agregar un archivo web.config a la carpeta Vistas y pegar el siguiente código en él.

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

Tenga en cuenta que para MVC 3 tendrá que cambiar la versión a 3.0.0.0 en

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

Puede que tenga que cerrar y abrir la página * .cshtml nuevamente para ver los cambios.

Ashish Kaul
fuente