Razor 视图未看到 System.Web.Mvc.HtmlHelper

我正在升级到 MVC4。我已经按照指示在 http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806,但在我的剃刀视图和布局我有错误喜欢

  • “ System.Web.WebPages. Html.HtmlHelper”不包含定义 “ BeginRouteForm”和没有扩展方法“ BeginRouteForm” 接受类型的第一个参数 可以找到“ System.Web.WebPages. Html.HtmlHelper”(是否缺少 使用指令还是汇编引用?)

我还有一些错误,比如:

  • ”‘ Viewbag’这个名字在当前上下文中不存在

当我将鼠标悬停在@Html 上时,我可以看到它是 System 类型的。韦伯。网页。Html.HtmlHelper 非系统。韦伯。MVC.HtmlHelper

我不太确定还有什么其他相关信息,但这就是我所在的地方:

  • 我还没有把 sln 中的类库等更新到.net 4.5。
  • 这个项目是在 VS2010中创建的,但是我在 VS2012
  • 该项目打开并运行 VS2012,. Net 4.0,MVC 3

感谢你的指点。

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

  • System.Web.Mvc,Version = 4.0.0.0
  • System.Web.WebPages,Version = 2.0.0.0
  • System.Web.Helpers,Version = 2.0.0.0
  • 系统。网页。网页。剃须刀, Version = 2.0.0.0

在我的/views/web.config (或者/views/share/web.config,如果我尝试下面@Paul 的解决方案)元素中,我有自己的基类型,它从 System 继承。韦伯。MVC.WebViewPage 中,包含库中的引用已经更新为 MVC4,进入定义将我带到 MVC4 dll。

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

104526 次浏览

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

我刚开始调查这个问题,我的情况是这样的。如果你有正确的值在您的网络配置,那么它只是一个错误在 MVC4。 Http://connect.microsoft.com/visualstudio/feedback/details/727729/viewbag-not-recognized-in-asp-net-mvc-4-project

我在更新到 MVC 5时也遇到了同样的问题,通过更新视图文件夹中的 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>

Host-> factoryType 被设置为 version: 4.0.0.0 希望这对大家有帮助。

我尝试了这里所有的解决方案,但没有一个对我有用。同样,我的网站运行得很好,但是我没有智能感觉,在我的视图下面有很多 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 中,修改版本以匹配在我的项目引用中找到的每个程序集的编号(右键单击提到的每个引用并选择“ Properties”,在属性窗口的底部为选中的引用提供“ Version”)。

在实现了上面的方法之后,我现在有了智能感知,并且在像 Html.BeginFormViewBag.Title等等这样的东西下面没有得到任何未知的红线。

我在使用 Web 应用程序时遇到了这个问题——当我需要 System.Web.Mvc.WebViewPage时,我的 .cshtml文件卡在了 System.Web.WebPages.WebViewPage基类上。

首先,确保 ~/Views/web.config 文件具有正确的 pageBaseType

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

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

  1. 对解决方案进行全面检查
  2. 卸载带有问题的项目
  3. 删除 VisualStudio 在项目旁边生成的 .user文件。
  4. 用问题重新装载项目
  5. 构建解决方案

对于 VS2015 .user.sln文件已经移动到 .sln文件旁边创建的 .vs隐藏文件夹。然而,从下面的评论来看,错误信息暗示我工具使用了完全错误的 MVC 版本,删除这个文件夹并不能解决这个问题。据我所知,没有已知的解决办法。

我已经干净地运行了一个项目,并且安装或重新安装了所有的东西,尽管我的站点编译和运行良好,但仍然会出现许多智能感知错误。当我更改了视图文件夹中 web.config 文件中的版本号时,Intellisense 终于对我起作用了。在我的例子中,我在 Orchard 中编写了一个模块,它运行在一个 MVC 区域中,但是我认为这将帮助任何使用最新版本的 MVC 的人。这是我的 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>

仅仅扩展 Matt DeKrey 的答案,仅仅删除 csproj.user 文件(不需要重新创建解决方案)就可以为我解决这个问题。

我唯一的副作用是我需要重置开始行动回到使用一个特定的页面。

在收缩的世界里,我经常使用使用旧图像的机器。在尝试了以上所有方法之后,我决定将我的 VS 2013更新到最新版本(更新4)。经过90分钟和重新启动参考现在正常工作!希望这个能帮上忙!

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

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

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

  1. MVC版本及其子库修复为新版本(展开 References,然后右键单击 onSytem.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>

尝试了所有的方法都是徒劳的,我发现在我的例子中它不起作用,因为 Web Project csproj 文件中的属性值不正确。当我将 工具版本改为 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=
.....

作为一个主题的变体,我可以上下发誓我的视图 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,因为那个安全更新被推出了一段时间。

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

对我来说,解决办法是改变以下方面:

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

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

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

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

我发现这个问题的原因是我在 web.config 中为不工作的区域添加了一个 SQL ConnectionString,这(我假设)导致了一个解析错误,但是项目正确地编译了。

将 ConnectionString 移动到全局 web.config 已经纠正了这个问题。

只有在创建了一个名为 BaseViewPage的自定义类并覆盖了 WebViewPage类之后,才会出现这种情况。我最初在我的 总部 Web.cong 文件中添加了以下内容:

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

对于 观景文件夹 web.config 文件也是如此:

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

我尝试了许多其他的答案,但没有一个答案能让我保留我的 BaseViewPage课程。我修复它的方法是仅从 总部 Web.config 文件中删除 pageBaseType属性。保存在 观景 web.config 中。

我在 SO 中找到了几个答案,最后我意识到我的错误是拼错了“ Html”。TextBoxFor”在我的例子中,我写的是“ Html。TextboxFor”我没有在 TextBoxFor 中将 B 大写。修好了,瞧。问题解决了。我希望这能帮到别人。

我在 MSDN 上使用了以下文章来解决这个问题(在本例中是从 MVC 4到 MVC 5)

Https://learn.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 (不是视图文件夹中的那个)

在运行时块更新系统中。韦伯。Mvc 到5.0.0.0,System。韦伯。帮助程序到3.0.0.0和系统。韦伯。网页到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>

然后查找 apptings 块并更新网页: Version value to 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>

最近遇到了同样的问题,我是这样解决的: 在 Visual Studio 上,如果你的项目已经打开,Goto:

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

它将加载您的项目中缺少的东西,所有这些都应该回到正轨。

好吧,我一直在想办法解决这个问题。关于这一点,我已经使用了 Stack Overflow 主题中的所有解决方案,但似乎没有一个是有效的。

我今天上午刚刚解决了这个问题。在为项目和视图提供了 web.config 之后,确保所有的。Dll 版本与您在 reference 文件夹中的内容相匹配。您需要卸载项目,编辑。然后更新所有。文件中的 dll 版本。

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

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

这也修复了上下文菜单的问题,我没有选择添加控制器,视图等。

VisualStudio2017用户更新:

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

这解决了我的问题