72

我正在升级到 MVC4。我已按照http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806上的说明进行操作,但在我的 Razor 视图和布局中出现类似错误

  • 'System.Web.WebPages.Html.HtmlHelper' 不包含 'BeginRouteForm' 的定义,并且没有扩展方法 'BeginRouteForm' 接受类型为 'System.Web.WebPages.Html.HtmlHelper' 的第一个参数(你是缺少 using 指令或程序集引用?)

我也有错误,如:

  • “当前上下文中不存在名称‘Viewbag’

当我将鼠标悬停在@Html 上时,我可以看到它的类型是 System.Web.WebPages.Html.HtmlHelper 而不是 System.Web.Mvc.HtmlHelper

不太确定还有哪些其他信息是相关的,但这是我所在的位置:

  • 我还没有将 sln 中的类库等更新到 .net 4.5。
  • 该项目是在 VS2010 中创建的,但我正在 VS2012 中进行迁移
  • 该项目使用 VS2012、.Net 4.0、MVC 3 打开并运行正常

任何指针表示赞赏。

编辑: web.config 中的所有引用和文件升级为:

  • System.Web.Mvc,版本=4.0.0.0
  • System.Web.WebPages,版本=2.0.0.0
  • System.Web.Helpers,版本=2.0.0.0
  • System.Web.WebPages.Razor,版本=2.0.0.0

编辑(2): 在我的 /views/web.config (或 /views/shared/web.config 如果我尝试下面的@Paul 的解决方案)的元素中,我有自己的基类型,它继承自 System.Web。 Mvc.WebViewPage ,包含库中的引用已更新为 MVC4 并转到定义将我带到 MVC4 dll。

新版本在这方面有什么变化吗?我在发行说明中看不到任何相关内容。

4

22 回答 22

93

我在使用 Web 应用程序时遇到了这个问题——.cshtmlSystem.Web.WebPages.WebViewPage我需要System.Web.Mvc.WebViewPage.

首先,确保您的 ~/Views/web.config 文件具有正确的pageBaseType. 就我而言,我设置为System.Web.Mvc.WebViewPage.

<configuration>
  <system.web.webPages.razor>
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <!-- ... -->
    </pages>
  </system.web.webPages.razor>
</configuration>

然后,重要的是,如果上面已经很好,有些人发现这是关键:

  1. 在解决方案上运行清洁
  2. 卸载有问题的项目
  3. 删除.userVisual Studio 在项目旁边生成的文件。
  4. 重新加载包含问题的项目
  5. 构建解决方案

对于 VS2015.user.sln文件已移动到.vs文件旁边创建的隐藏文件夹中.sln。但是,从下面的评论中,错误消息暗示我该工具完全使用了错误的 MVC 版本,删除此文件夹并不能解决问题。据我所知,没有已知的解决方案。

于 2014-04-30T13:36:16.463 回答
28

我在更新到 MVC 5 时遇到了同样的问题,通过更新 Views 文件夹中的 web.config 解决了这个问题。

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

主机 -> factoryType 设置为 version:4.0.0.0 希望这对任何人都有帮助。

于 2014-02-02T19:31:01.663 回答
9

我在这里尝试了所有解决方案,但没有一个对我有用。同样,我的网站运行良好,但我没有智能感知,并且在我认为 Visual Studio 无法识别的许多事物下出现红色波浪线,其中之一是Html.BeginForm(),以及与ViewBag.

我正在处理一个新的 MVC 5 项目。经过数小时比较 web.config 行后,我终于找到了为我解决的问题。

我的根目录中的 web.config 有以下行:

<system.web>
  <compilation debug="true" targetFramework="4.5" />

  <!-- ... -->
</system.web>

我将之前的项目与不使用 MVC 5 的项目进行了比较,并复制了一个我注意到新项目缺少的块,如下所示:

<system.web>
  <compilation debug="true" targetFramework="4.5">
    <assemblies>
      <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add assembly="System.Web.Helpers, Version=3.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=5.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </assemblies>
  </compilation>

  <!-- ... -->
</system.web>

我将上面的块复制到根目录中我的新项目的 web.config 中,更改版本以匹配在我的项目引用中找到的每个程序集的数字(右键单击提到的每个引用并选择“属性”,给出“版本”在所选参考的属性窗口底部)。

Html.BeginForm实现上述操作后,我现在有了智能感知,并且在,ViewBag.Title等下面没有任何未知的红线。

于 2014-04-13T02:28:06.370 回答
7

我已经运行了一个干净的项目,并安装或重新安装了所有东西,但仍然收到很多 Intellisense 错误,即使我的网站正在编译和运行良好。当我更改 Views 文件夹中 web.config 文件中的版本号时,Intellisense 终于为我工作了。就我而言,我在 Orchard 中编写了一个模块,该模块在 MVC 区域中运行,但我认为这将帮助任何使用最新版本的 MVC 的人。这是Views 文件夹中的我的 web.config

    <?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.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <pages pageBaseType="Orchard.Mvc.ViewEngines.Razor.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.Linq" />
            <add namespace="System.Collections.Generic" />
          </namespaces>
        </pages>
      </system.web.webPages.razor>

      <system.web>

        <!--
            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.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
            pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
            userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
          <controls>
            <add assembly="System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 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>
于 2014-05-05T00:49:37.957 回答
4

您需要复制Views/Web.config/Shared. 这将告诉 Razor 使用 MVC 基本类型和解析器。你可以在这里阅读更多:http: //blog.slaks.net/2011/02/dissecting-razor-part-3-razor-and-mvc.html

于 2012-08-20T16:47:29.670 回答
3

Visual Studio 2013从升级到后,我正在处理这个问题Visual Studio 2015在尝试了在这篇文章和其他类似的 SO 帖子中找到的大部分建议之后,我终于找到了问题所在。修复的第一部分是将我所有的东西更新到最新版本(如果你遇到错误,NuGet你可能需要这样做)之后,我不得不,因为你可能需要,修复列出的版本意见。这包括:VS13Nuget Web.config

  1. MVC将版本及其子库修复到新版本(展开References然后右键单击Sytem.Web.MVC然后Properties获取您的版本)
  2. 修复Razor版本。

我的看起来像这样:

<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.2.3.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.Optimization"/>
        <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>
    <pages
      validateRequest="false"
      pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
      pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
      userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=5.2.3.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>
于 2015-08-18T04:19:41.433 回答
3

Visual Studio 2017 用户更新:

如果您刚刚迁移到 Visual Studio 2017 并且您的项目是 MVC4,请确保返回 VS2017 安装程序并检查“ASP.NET 和 Web 开发”部分下的 MVC4 选项。它是一个可选组件,默认情况下未选中。

这解决了我的问题

于 2018-02-12T01:54:10.250 回答
2

在承包世界中,我经常使用使用旧图像的机器。在尝试了上述所有操作后,我决定将我的 VS 2013 更新到最新版本(更新 4)。90 分钟后重新启动,参考现在工作正常!希望这可以帮助!

于 2015-04-28T16:44:56.080 回答
2

徒劳地尝试了一切,我发现在我的情况下它不起作用,因为 Web Project csproj 文件中的属性值不正确。当我将ToolsVersion更改为14时,它与我当前的 IDE 版本(即 Visual Studio 2015)相匹配,一切都像一个魅力:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition=
  .....
于 2015-09-10T19:15:16.867 回答
2

对于那些在将项目从 VS 2013 迁移到 VS 2015 后遇到此问题的人,我能够通过从https://visualstudiogallery.msdn.microsoft.com/c94a02e9-f2e9-安装 ASP.NET 工具更新来解决此问题4bad-a952-a63a967e3935/file/77371/6/AspNet5.ENU.RC1_Update1.exe?SRC=VSIDE&UPDATE=TRUE

于 2016-01-07T14:53:59.487 回答
1

只是为了扩展 Matt DeKrey 的答案,只需删除 csproj.user 文件(无需重新创建解决方案)就可以为我解决问题。

我唯一的副作用是我需要将开始操作重置为使用特定页面。

于 2014-11-03T04:22:48.950 回答
1

我在 MSDN 上使用了以下文章来解决这个问题(在这种情况下从 MVC 4 到 MVC 5)

https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc- 5-and-web-api-2

文章主要摘录如下:

主 Web.config(不是 Views 文件夹中的那个)

在运行时块中更新 System.Web.Mvc 到 5.0.0.0 ,System.Web.Helpers 到 3.0.0.0 和 System.Web.WebPages 到 3.0.0.0

<dependentAssembly>
  <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
  <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>

<dependentAssembly>
  <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
  <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>

<dependentAssembly>
  <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
  <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>

然后查找 appsettings 块并将 pages:Version 值更新为 3.0.0.0

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
</appSettings>

查看 Web.config

将主机 factoryType 块更新为 System.Web.Mvc 到 5.0.0.0

<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" />
      </namespaces>
   </pages>
</system.web.webPages.razor>

然后在页面块下将对 System.Web.Mvc 的任何引用更新为 5.0.0.0

    <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 对 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>
于 2017-06-14T14:31:44.060 回答
1

最近遇到了同样的问题,这就是我修复它的方法:在 Visual Studio 上打开有问题的项目,转到:

  1. 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet 包
  2. 在打开的窗口中,选择更新。然后单击全部更新

它将加载您项目中缺少的内容,并且一切都应该回到正轨。

于 2017-10-12T10:27:32.603 回答
0

我自己刚开始研究这个问题,这就是我的情况。如果您的 Web 配置中有正确的值,那么它只是 MVC4 中的一个错误。 http://connect.microsoft.com/VisualStudio/feedback/details/727729/viewbag-not-recognized-in-asp-net-mvc-4-project

于 2013-07-30T21:37:34.463 回答
0

我在 SO 中遇到了几个答案,最后我意识到我的错误是我拼错了“Html.TextBoxFor”。就我而言,我写的是“Html.TextboxFor”。我没有大写 TextBoxFor 中的 B。解决了这个问题,瞧。问题解决了。我希望这可以帮助别人。

于 2017-02-23T21:30:33.903 回答
0

是的,我一直在尝试解决这个问题。我已经使用了有关此问题的各种 Stack Overflow 主题中的所有解决方案,但似乎没有一个有效。

我今天早上刚刚解决了这个问题。在为项目和视图修复 web.config 后,确保所有 .dll 版本都与您在引用文件夹中的内容匹配。您需要卸载项目,编辑 .csproj,然后更新该文件中的所有 .dll 版本。

System.Web.Helpers
System.Web.Mvc
System.Web.WebPages

希望这会有所帮助,因为我终于解决了这个问题!没有更多的红色波浪线。

这也解决了我遇到的上下文菜单问题,我没有选择添加控制器、视图等。

于 2017-11-18T10:17:32.207 回答
0
*<system.web>
<compilation debug="true" targetFramework="4.5">
    <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=3.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=5.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </assemblies>
</compilation>*

缺少此配置,添加它并设置适当版本的程序集

于 2015-08-10T18:24:17.190 回答
0

我的情况只发生在我创建了一个名为BaseViewPage覆盖该类的自定义类之后WebViewPage。我最初将以下内容添加到我的Main Web.confg 文件中:

<pages pageBaseType="ZooResourceLibrary.Web.Support.BaseViewPage">

查看文件夹 web.config 文件相同:

<pages pageBaseType="ZooResourceLibrary.Web.Support.BaseViewPage">

我尝试了许多其他答案,但都没有成功,同时仍然允许我继续BaseViewPage上课。我修复它的方法是仅从Main Web.config 文件中删除该pageBaseType属性。将其保存在View web.config 中。

于 2017-01-18T16:58:22.743 回答
0

对我来说,这是一个愚蠢的部署错误:Web 项目可以有多个 web.config。它在开发人员的机器上工作,而不是在生产环境中,但我们没有意识到部署脚本只抓取了Web.config根目录下的文件,并没有复制Web.config文件Views夹中的文件。

于 2016-05-30T12:08:24.030 回答
0

我也遇到过这个具体问题;尝试使用剃须刀标签时没有(或不正确)智能感知显示。我的具体问题是 VS2015 抱怨 Html.BeginForm 在当前上下文中不存在。

我在我的 MVC 项目中设置了区域,并设法将我的错误原因缩小到特定区域的 web.config 文件,而不是全局 web.config。

事实证明,对我来说这个问题的原因是我在 web.config 中添加了一个 SQL connectionString 到不工作的区域,这(我假设)导致解析错误,但是项目编译正确.

将 connectionString 移至全局 web.config 已解决该问题。希望这可能对其他人有用。

于 2016-06-07T12:03:08.010 回答
0

作为主题的变体,我可以上下发誓我的 Views\Web.config 是正确的:

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

但我实际上需要参考Version=4.0.0.1,而不是Version=4.0.0.0因为不久前推出的安全更新。

于 2015-10-02T20:23:53.390 回答
-1

对我来说,解决方案是更改以下内容:

  <pages
        validateRequest="false"
        pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
    </pages>
于 2016-02-22T09:36:16.407 回答