当前上下文中不存在名称为'ViewBag'的变量。

93

我正在尝试在我的应用程序中使用ViewBag,我拥有所有最新版本的dll文件和MVC 3版本,但是我仍然收到以下错误:

 

"当前上下文中不存在'ViewBag'的名称"

我甚至已经卸载并重新安装了MVC 3,但没有任何改变。

此外,我不认为这些dll文件显示在全局程序集缓存(GAC)中。

可能是什么问题?或者如何将dll文件添加到GAC中?


1
请注意,对于5.2.2.0版本,web.config文件应该指向5.2.2.0版本,但是MVC程序集的Views/web.config文件应该指向5.1.0.0版本。 - Bart Calixto
16个回答

85

我遇到了同样的问题。原来是因为我从一个空的ASP.NET应用程序创建项目,而不是使用ASP.NET MVC模板,导致缺少./Views/Web.config文件。

对于ASP.NET MVC 5,一个普通的./Views/Web.config文件包含以下内容:

<?xml version="1.0"?>

<!-- https://dev59.com/42445IYBdhLWcg3wQn8j#19899269 -->
<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>

添加一个包含此内容的./Views/Web.config文件已经成功地解决了我的问题。


3
最终解决方案是我没有将 /Views/Web.config 文件部署到服务器上,这个缺失的文件是错误的原因。 - Stack Man
2
第二次回来并使用了这个解决方案! :) - user230910
2
在浪费了一整天的时间试图解决它之后,这个方法对我很有用。谢谢。我需要添加到“./Views/Web.config”中的<namespaces>标签的唯一内容是;<add namespace="System.Web.Optimization"/> - dunwan
在我的情况下,由于某种原因,元素不在根Web.config中,而是在我创建MVC5布局时添加到了“Views”下的Web.config中。我将这些元素迁移到了根Web.config中,并删除了“额外”的Web.config文件。 - JDPeckham
2
老兄,上帝保佑你。我被这个问题极度烦恼了。 - Dragan B.

39

谢谢!那个链接很有帮助!我猜这一切都是因为制作一个基于MVC 3 Beta的网站,然后当你获取最新版本时,Web配置文件没有被更改。谢谢! - efleming
我已经更新了我的帖子,并提供了相关的修复方法:http://stevesmithblog.com/blog/viewbag-does-not-exist-in-current-context/ - ssmith
您可以使用升级工具(请参见更新的答案)来确保您的配置正确。 - marcind
3
请注意:如果您有额外的视图位置,即正常的~/Views位置之外的位置,请同样将~/Views/Web.config复制到该位置。 - Dave Thieben

19

尝试清理并重新构建。在我的情况下它起作用了。


没想到我浪费了时间猜测我的代码有什么问题...谢谢,它起作用了。 - Mr_Hmp
这个能够工作真是让人恼火...我总是忘记做这个,浪费了很多时间...这不应该是必要的。 - TCC
在我的情况下,我不得不从解决方案中删除“packages”文件夹并进行清理。 - Nerdroid

9

我在一个使用Visual Studio 2015升级到MVC 5的解决方案中遇到了同样的问题。

在Views文件夹内的web.config文件(不是根目录下的web.config文件)中,将<configSections>中引用的版本号从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>

2
非常感谢!这个版本的东西真是疯狂。每次我转身时,微软的升级都互相覆盖。Ling to SQL 被 Entity Framework 取代,MVC 从1到6,等等。 - JustJohn
谢谢,已经解决了我的VS2017问题。 - JustSomeQuickGuy
固定 VS 2019 mvc 5 应用程序。 - MrDywar

6
经过尝试,发现是 VS 缓存问题。您可以通过删除位于以下路径的缓存文件来解决它:

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

关闭项目,删除该路径下的文件,重新打开项目,清理解决方案并再次构建即可解决问题。
这些文件将在下次启动 Visual Studio 时重新创建。

这在v15(VS 2017)中对我也起作用。我可能从未想过要这样做...感谢Wilson&Silver为我节省了大量时间! - Paul Schroeder
通用路径 %LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache - fiat

3

我曾经遇到了同样的问题,之后得到了crimbo的正确提示,问题是由于./Views/Web.config文件存在但不包含正确的命名空间导致的,我猜测...

我创建了一个空的MVC5项目,并将其./Views/Web.config导入到我的现有项目中,然后每个ViewBag使用下方的红色波浪线都消失了!


Visual Studio 2013,创建了一个勾选了MVC框的空白Web项目。它会创建所有文件结构,并带有最少的MVC命名空间引用。我添加了一个简单的控制器和视图。我得到了编译错误:“在命名空间'System.Web.Mvc'中找不到类型或命名空间名称为'Ajax'(是否缺少程序集引用)”。文件编辑器还显示警告:“当前上下文中不存在'ViewBag'的名称”。转到项目引用,找到System.Web.Mvc,将本地副本设置为true。清理构建并重新构建,问题得到解决。 - Kagan Agun

2

2

我有一个./Views/Web.Config文件,但在发布网站后出现了这个错误。原来该文件的构建操作属性设置为None而不是Content。将其更改为Content可以使发布正常工作。


1

我已经尝试过删除bin和obj文件并重新启动VS,但没有成功。

我也遇到过这个问题很多次,每次解决都很麻烦。通常是由于web.config文件中的某个引用版本不正确所致。这意味着在Visual Studio中点击引用以查看属性选项卡中的版本,然后将其与web.config文件中的版本匹配。

另一种方法是(如果可能)升级到更高版本的.NET Framework,然后删除bin/obj文件并重新启动Visual Studio。我只能假设它正在更改某些内容

csproj文件之间的差异快速检查实际上并没有显示出任何重大差异...但它显示出的差异是(我已添加(删除)以显示旧行)

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

在Web.Config文件中(不是View中的文件)。
<add key="webpages:Version" value="2.0.0.0" /> (remove)
<add key="webpages:Version" value="3.0.0.0"/>

它也被添加到了同一个web.config文件中,但我手动删除了它。
 <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>

最后,在“程序包管理器控制台”中添加update-package

在本地运行网站并查看任何编译错误,这些错误已由我的第二段修复(匹配引用的版本)


1
在我的情况下,将网页的“版本”更改为正确的值解决了我的问题,对我来说,正确的值是(2.0.0.0而不是3.0.0.0):
<appSettings>
        <add key="webpages:Version" value="2.0.0.0"/>
        <add key="webpages:Enabled" value="false"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接