Razor Views没有看到System.Web.Mvc.HtmlHelper

时间:2012-08-20 16:40:36

标签: c# razor asp.net-mvc-4

我正在升级到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,Version = 4.0.0.0
  • System.Web.WebPages,Version = 2.0.0.0
  • System.Web.Helpers,Version = 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。

新版本在此区域有任何变化吗?我在发行说明中看不到任何相关内容。

20 个答案:

答案 0 :(得分:87)

我使用Web应用程序遇到了这个问题 - 当我需要.cshtml时,我的System.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. 删除Visual Studio在项目旁边生成的.user文件。
  4. 使用问题重新加载项目
  5. 构建解决方案
  6. 对于VS2015 .user.sln文件已移至.vs文件旁边创建的.sln隐藏文件夹。但是,从下面的评论中,错误消息暗示我的工具完全使用了错误版本的MVC,删除此文件夹并不能解决问题。据我所知,还没有一个已知的解决方案。

答案 1 :(得分:25)

我在更新到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>

主持人 - &gt; factoryType设置为version:4.0.0.0 希望这对任何人都有帮助。

答案 2 :(得分:9)

我在这里尝试了所有的解决方案,但没有一个适合我。再一次,我的网站运行良好,但我没有智能感知,并且在我的视图中看到很多东西的红色波浪线,Visual Studio无法识别,其中一个是Html.BeginForm(),以及任何有与ViewBag

有关

我正在使用新的MVC 5项目。经过几个小时的比较web.config行,我终于找到了为我修复的内容。

我的root中的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中,更改版本以匹配项目引用中找到的每个程序集的数字(右键单击提到的每个引用并选择&# 34;属性&#34;,&#34;版本&#34;在所选参考的属性窗口底部给出。

执行上述操作后,我现在有了智能感知功能,并且在Html.BeginFormViewBag.Title等内容下不会出现任何未知的红线。

答案 3 :(得分:6)

我已经运行了一个项目干净,并安装或重新安装了所有内容,并且仍然遇到很多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>

答案 4 :(得分:4)

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

答案 5 :(得分:3)

在从Visual Studio 2013升级到Visual Studio 2015后,我正在处理此问题。在尝试了此帖和其他类似SO帖子中发现的大部分建议后,我终于找到了问题。修复的第一部分是将我的所有NuGet内容更新到最新版本(如果您遇到VS13错误,可能需要在Nuget中执行此操作),I您可能需要修复视图 Web.config中列出的版本。这包括:

  1. MVC版本及其子库修复为新版本(展开References,然后右键单击Sytem.Web.MVC,然后Properties以获取您的版本)
  2. 修复Razor版本。
  3. 我看起来像这样:

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

答案 6 :(得分:2)

Visual Studio 2017用户更新:

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

这解决了我的问题

答案 7 :(得分:2)

在签约世界中,我经常使用使用较旧图像的机器。尝试了以上所有内容后,我决定将我的VS 2013更新到最新版本(Update 4)。 90分钟后重启,参考文件现在正常运行!希望这有帮助!

答案 8 :(得分:2)

对于那些在将项目从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工具更新来解决此问题。

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

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

  1. 工具 - &gt; NuGet包管理器 - &gt;管理解决方案的NuGet包
  2. 在打开的窗口中,选择更新。然后点击全部更新
  3. 它会加载你项目中缺少的东西,所有这些都应该回到正轨。

答案 11 :(得分: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

文章的主要摘录是:

Main 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块并更新网页:版本值为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>

答案 12 :(得分: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因为安全更新被推迟了一段时间。

答案 13 :(得分:0)

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

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

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

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

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

答案 14 :(得分: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属性。将其保留在查看 web.config。

答案 15 :(得分:0)

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

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

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

将connectionString移动到全局web.config已纠正此问题。希望这对其他人有用。

答案 16 :(得分:0)

至于我,这是一个愚蠢的部署错误:Web项目可以有多个web.config。它正在开发人员的机器而不是生产中,但是我们没有意识到部署脚本只抓取了根目录下的Web.config文件,并且它没有复制Web.config文件在{ {1}}文件夹。

答案 17 :(得分: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>*

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

答案 18 :(得分:0)

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

答案 19 :(得分:-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>
相关问题