当前上下文中不存在名称为'ViewBag'的变量 - Visual Studio 2015

121

我又开始使用ASP.NET进行开发,但在Visual Studio中遇到了一个小错误。我的.cshtml文件在使用一些razor函数时会显示错误,例如:“当前上下文中不存在'ViewBag'的名称”。这是一张图片:

screenshot of problem in visual studio 2015

我正在使用一个演示项目,你可以在这里找到该项目:https://github.com/Wintellect/Angular-MVC-Cookbook/tree/master/BasicProject 我查看了其他几个帖子,大多数建议更新web.config文件。这两个配置文件已经存在,由于它是一个相当受欢迎的演示,我认为它已经包含了所有必需的配置。当然,我已经查看了这些配置文件,并确实包括了建议的解决方案。
其他细节如下:
  • 我已经在解决方案上使用了清理和重建,但没有改变任何东西。
  • 当我创建一个全新的MVC项目时,它可以正常工作。
  • 我的朋友也有同样的问题,我们都使用VS 2015和Windows 10。
  • 我仍然可以运行应用程序,并且它可以正常工作。

你正在运行哪个项目?基础?CRUD,路由? - Prashant Ghimire
1
@Henk,不幸的是那并没有起作用。 - Michjuh
@Burk 抱歉回复晚了,但是我没有解决这个问题。对于大多数项目来说这不是问题,所以最终我停止尝试了。我还没有尝试过Benjamin Anderson的答案,这是我以前从未尝试过的,也许会有用。 - Michjuh
@Michjuh 我知道为什么会发生这种情况。刚刚回答了这个问题。 - Burk
我不了解实际情况,但在我的情况下,我进入属性中选择了先前的目标框架(从4.6到4.5.2),重新编译后所有问题都消失了。然后我又返回到4.6并重复了同样的操作。 - Gianpiero
显示剩余5条评论
20个回答

145

尽管我已经配置正确,但我仍然遇到了这个问题。

后来发现这是由于组件缓存中的一些损坏文件导致Razor视图无法识别ViewBag、Model和HtmlHelpers。删除这些文件可以解决该问题(在下次打开Visual Studio时会创建这些文件的好版本)。

这些文件位于以下位置:

%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache

删除所有四个文件:

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

我后来在其他几台开发者机器上也看到了同样的问题,这种方法可以快速解决它。


15
真棒,这解决了我的问题。我还发现删除你的临时ASP.NET文件也有帮助。C:\ Users \ your.name.here \ AppData \ Local \ Temp \ Temporary ASP.NET Files - Kevin
1
这解决了我由于将 .net 4 升级到 4.5.2 和 mvc 3 升级到 5 所引起的问题。 - Joe Phillips
7
我的文件夹是 15.0_7e8de76c\ComponentModelCache,用于 VS 2017。 - Kevin .NET
3
这个解决方案也适用于VS 2019,不要忘记关闭VS,然后稍后重新打开,以便在正确的版本控制上建立缓存。此外,在views/web.config和主web.config中,MVC版本应该相同。System.Web.WebPages.Razor也遵循同样的规则。 - youngseagul
2
看起来在这种情况下使用的模板(XX.0_XXXXXXXXX\ComponentModelCache)与16.0_277b98eb\ComponentModelCache几乎相同。清空文件夹。重新启动VS。问题已解决。 - Danie Schoeman
显示剩余7条评论

48

在Views文件夹中的web.config文件的设置中更新版本号。

 <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
如果您通过Nuget更新了MVC版本,则应该是:
 <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

可能需要更新其他依赖版本。MVC帮助程序和对象视图中的编译和命名空间问题通常与View文件夹中混乱的web.config文件有关。


13
这对我有效,尽管我不得不输入版本号5.2.0.0而不是5.2.2.0。您可以通过转到“ 引用”>“ System.Web.MVC”并选择“ 属性”来查看您的版本。感谢您的帮助。 - user2233949
我正在使用MVC版本4.0.0.0,我可以从属性中看到它。在我的情况下应该怎么修复? - Zeeshan
检查您所有的web.config文件,并确保它们都使用了正确的主机版本。有时,在覆盖概述文件夹中的设置时,问题可能会被忽略而没有得到纠正。 - Benjamin Anderson
1
我尝试了所有其他建议,但是这个在使用5.2.3.0版本时对我有效。谢谢Benjamin。 - Mitch
2
这对我来说是正确的答案。在更改web.config后,不要忘记关闭所有的*.cshtml*.vbhtml文件并清理和重建解决方案。VS 2019 16.1.2 - Štěpán
显示剩余3条评论

28

我不小心从Views文件夹中删除了web.config,认为它是没有必要的。当我把它放回去后,它开始工作了。


23

在appsettings中找到“webpages:Version”,并将其更新为版本3.0.0.0。我的web.config文件中已经有了。

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

然后我将它更新到

<add key=”webpages:Version” value=”3.0.0.0″ />

1
我删除了这两行代码(webpages.Version, webpages.Enabled),现在MVC 5.2看起来工作正常。 - Grappachu
这应该在Web.config的两个版本中进行更新,项目根目录和任何区域的Web.configs也需要更新。 - Sonu K
谢谢。对于我的情况,有问题的标签位于<configuration> - <configSections> - <sectionGroup name="system.web.webPages.razor">下。我需要更改<sectionGroup name="system.web.webPages.razor">、<section name="host">和<section name="pages">以使用Version = 3.0.0.0。 - Hong
清除缓存(包括“Temporary ASP.NET Files”文件夹)并没有帮助,但是这个答案有用 - Vanity Slug
3
这个设置到底是什么意思?它对应什么?你如何确定你的应用程序依赖于哪个版本? - jpmc26

15

尝试了各种方法后,发现某个东西修改了我的 /Views/Web.Config 中的 <sectionGroup>,将本应为 CamelCase 的 System.Web.WebPages.Razor 修改为小写的 system.web.webpages.razor。这最终导致了我的失败。

希望这可以帮助其他有同样问题的人……

供参考,以下是针对我的情况的正确条目。

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

4
我的文本全是小写,但并没有解决我的问题。 - Paul Totzke
天啊,这也是我的失败原因。我简直不敢相信你发现了这个问题,@jbwedtech。 - Luke Puplett
我也曾经使用小写字母,但更改大小写并没有解决问题。 - Andy Brown

7
我曾多次遇到这个问题,最终发现是因为视图文件夹应该包含自己的web配置文件。

2
但是 web.config 中应该放什么呢?它不应该是自动生成的吗?_(更新)_ 找到了应该放什么以及它是如何生成的: https://dev59.com/WYnca4cB1Zd3GeqP6ybB#29306208 - drzaus
是的,你说得对,在我的项目中,Web.Config之前不存在(是的,它应该自动生成,但是我从之前的开发人员那里接手了一个项目,不确定他为什么删除了它)。 在Views文件夹中添加Web.Config文件后,它就可以工作了。 - Vikas Lalwani

6
有时在web.config的设置中更改版本号并不足够。这个问题是由于Visual Studio 2015没有mvc4工具造成的。
解决方法是将项目升级到MVC 5。这完全解决了问题。你可以从这个页面获得帮助。它清楚地解释了如何操作。 http://www.asp.net/mvc/overview/releases/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc-5-and-web-api-2 顺便说一下,Visual Studio团队声明他们将在第一个更新中添加对Visual Studio 2015的mvc4支持。

我检查了URL中提到的文章中的所有步骤,并发现了一些不一致之处。修复这些问题解决了该问题。 - miha

5
在我的情况下,我在一个项目中只有在我的PC上出现了这个问题。我的项目在VS2012中运行良好,但在VS2017中打开时出现了这个问题。
对我来说,主要问题是缓存。我的项目指向Razor和MVC的旧版本dll的缓存,并且无法找到新版本中添加的功能,例如ViewBag。 ViewBag是在Razor版本3中添加的,但因为我有Razor版本2的缓存,它找不到ViewBag(但它可以找到其他一些在版本2中存在的内容)。然而,仅清除缓存就不能解决我的问题。我们不得不改变配置文件,以便Razor使用“版本3而不是2”,MVC使用“版本5而不是4”,然后关闭VS,删除缓存,重新打开项目并重新构建。然后问题得到了解决。以下是更详细的说明。
以下是帮助我解决问题的更改顺序:
1. 在“Views”文件夹的Web.config中,更改所有设置MVC版本为4.0.0.0的位置为5.0.0.0,设置Razor版本为2.0.0.0的位置为3.0.0.0。
以下是我的情况下的这些行:
<sectionGroup name="system.web.webPages.razor" type="... Version=3.0.0.0 ...">
    <section name="host" type="... Version=3.0.0.0 ..." .../>
    <section name="pages" type="... Version=3.0.0.0 ..." .../>
</sectionGroup>
...
<host factoryType="... System.Web.Mvc, Version=5.0.0.0 ..." />
...
<pages
    ...
    pageParserFilterType="... Version=5.0.0.0 ..."
    pageBaseType="... Version=5.0.0.0 ..."
    userControlBaseType="... Version=5.0.0.0 ...">
    <controls>
        <add assembly="... Version=5.0.0.0 ..." ... />
    </controls>
</pages>

(备注:1)你的版本可能不同,我只是告诉你在我的情况下需要做什么。2)为了简洁起见,我省略了一些内容。3)即使你有 MVC 版本 5.3.2.0 等,你仍然应该输入 5.0.0.0,Razor 版本也是如此 - 在 3.0.0.0 中输入所有零)

  1. 在主配置文件(顶层文件)中将 webPages:version 从 2.0.0.0 更改为 3.0.0.0。

  2. 这个更改可能没有影响解决方案,但我还是会提一下。确保 "Views" 文件夹的 <namespaces> 部分与项目根目录的主 .conifg 文件的内容完全相同,例如:

<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.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
</namespaces>
  1. 最后,关闭VS。像Fenton建议的那样,删除%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache中的所有缓存文件(或者你正确的路径),同时删除.scan文件,即使它在答案中没有提到。完成后,打开VS,清理你的项目并重新构建。现在应该可以正常工作了。这对我有效。

1
谢谢。在我升级到MVC 5后,这对我的MVC 4应用程序有效。出于某种原因,这些文件没有使用新的版本号进行编辑。这应该是最佳答案。 - Jakal
1
尽管我通过阅读一些得票较高的答案意识到在我的情况下需要增加sectionGroup版本,但这个答案实际上强调了这一点。+1 - Quinton Smith

2

我参与得晚,但这些解决方案都对我无效。

我升级到了VS 2017,网站可以工作,但Visual Studio编译器破坏了大部分.cshtml文件。

简而言之:

mysolution.sln的版本不正确。

sln diff

因此,您需要使用更新的VS创建一个新解决方案,并将其与您的解决方案进行比较并复制版本信息。

完整的升级步骤:

  1. 确保.sln文件的版本适用于VS
  2. 在VS中右键单击MySolution>Nuget Manager>Updates>运行所有更新
  3. 在VS中右键单击MySolution>Application>更新目标框架(我这里是4.5.2)
  4. 修复.config文件中的任何版本问题(例如RAZOR到3.0.0.0)
  5. 修复编译器中的任何代码问题(对我来说,ForEach是模棱两可的)

我的项目是在VS2013中开始的,当我转到VS2017时,我开始看到这些错误,但一切都编译正常,所以我试图弄清楚发生了什么,但并没有太费力。由于打开一个视图会创建大量错误,这成为了一个问题。现在我使用的是VS2019,并偶然发现了你的修复方法;你太棒了!我的.sln文件版本是14.0.25123.0,应该是16.3.9。我还解决了框架的任何版本问题。幸运的是,我不必更新nuget包,因为我没有时间完全测试所有更新。 - Zonus

1

我已通过以下步骤添加了控制器:

  • 步骤1:添加 > 类
  • 步骤2:UserController
  • .
  • .
  • .

对应的代码已创建:

namespace SampleApp.Controllers
{
    public class UserController {
    }
}

我通过更改步骤1来更改我的错误:

  • 步骤1:添加 > 控制器
  • 步骤2:用户控制器
  • .
  • .
  • .

创建相应的代码:

namespace SampleApp.Controller {
    public class UserController : Controller {
    }
}

问题是: 我没有从“控制器”继承我的类。
我的错误信息中包含了其他消息 - 这些消息都源自这个问题:
错误CS0117:“ModelState”没有包含“IsValid”的定义; 错误CS0103:“RedirectToAction”的名称在当前上下文中不存在; 错误CS0103:“View”的名称在当前上下文中不存在; 错误CS0103:“ViewBag”的名称在当前上下文中不存在; 错误CS0103:“Json”的名称在当前上下文中不存在。
希望这个修改能帮助那些没有在初始步骤中注意到此问题的人。

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