VS2017 中的 MVC 3 错误:名称 'ViewData' 在当前上下文中不存在

MVC 3 error in VS2017: The name 'ViewData' does not exist in the current context

也许这是一个 Intellisense 问题,因为它通常只出现在 .cshtml 文件和代码 compiles/executes 中。我不确定。

我最近从 VS2010 迁移到 VS2017,我正在尝试使用 MVC3 项目。一切运行良好,但我收到多个与 MVC 语法相关的 Intellisense 错误。例如在视图 > 共享 > _Layout.cshtml:

<title>@ViewData["Title"]</title>

报错:

The name 'ViewData' does not exist in the current context

这是通过视图 > 主页 > Index.cshtml:

设置的
    @{
        ViewData.Title = "Dashboard"; // intellisense error also shows here
    }

尝试使用 @Html.Partial:

时同样会发生这种情况
'HtmlHelper' does not contain a definition for 'Partial' and no extension method 'Partial' accepting a first argument of type 'HtmlHelper' could be found (are you missing a using directive or an assembly reference?)

我不确定我的 dll 引用或 Web 配置是否存在某种问题。我已验证存在以下 dll 引用:

System.Web.Mvc - Version 3.0.0.0
System.Web.Razor - Version 2.0.0.0
System.Web.WebPages - Version 1.0.0.0
System.Web.WebPages.Razor - Version 1.0.0.0

在我的 Views/web.config 文件中:

  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.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=3.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" />
        <add namespace="System.Web.Optimization" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

还有我的根 web.config 文件:

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

<pages>
  <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.Routing" />
    <add namespace="System.Web.WebPages" />
  </namespaces>
</pages>

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
  </dependentAssembly>
</assemblyBinding>

虽然我不确定它为什么会这样,但你应该考虑使用 ViewBag 而不是 ViewData 的动态包装器。

ViewBag.Title = "Dashboard"; // in your action method

在你的视图代码中

@ViewBag.Title

最终使用 here 提出的解决方案(即使它是 VS2013):

MS says that for VS2013 "Intellisense for Razor (CSHTML and VBHTML) files is limited to HTML markup."

But if you add these two lines inside each .cshtml the intellisense will work again for MVC3 in VS2013:

@using System.Web.Mvc.Html

@inherits System.Web.Mvc.WebViewPage<dynamic>

Instead of dynamic you can put your Model's type.

我最近从 VS2017 迁移到 VS2019。我收到以下错误: “当前名称 'ViewData' 不存在”

我重新运行 visual studio 启动器并点击修改。 那么问题就解决了!

希望这个回答对您有所帮助。