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

Nik*_*nte 70 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,Version = 2.0.0.0

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

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

Mat*_*rey 90

我使用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>
Run Code Online (Sandbox Code Playgroud)

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

  1. 在解决方案上运行一个干净的
  2. 使用问题卸载项目
  3. 删除.userVisual Studio在项目旁边生成的文件.
  4. 用问题重新加载项目
  5. 构建解决方案

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

  • 我认为第二部分是关键.谢谢! (10认同)
  • 我同意@SerjSagan - 这并不能解决VS2015中的这些症状.我得到的错误是`'_Page_Views_Home_Index_cshtml'在编辑器中不包含'ViewBag'的定义,并且`错误列表中的名称空间'Microsoft'`中不存在类型或名称空间名称'AspNet'(CS0234) .我正在使用MVC 5,当我从VS2013更新到VS2015时,它都开始了.如果有人有任何帮助,我将不胜感激,因为这开始真的让我烦恼!哎呀! (9认同)
  • 马特 - 我已经花了这么多时间,最后你的解决方案奏效了.谢谢!卸载,删除.user和重新加载对我有用.什么是.user文件? (3认同)
  • .user文件是Visual Studio的项目设置缓存,例如当前打开的窗口等.根据我的经验,如果我注意到任何不稳定的东西,删除.user文件可能会有所帮助.另外,请注意.sln旁边的.suo文件; 它是同一类型的东西,但对于解决方案文件.(在旧版本的VS中,这个文件可能会被破坏,打破你的智能感知,例如...) (2认同)

小智 26

我在更新到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>
Run Code Online (Sandbox Code Playgroud)

主机 - > factoryType设置为version:4.0.0.0希望这可以帮助任何人.


Dav*_*son 9

我在这里尝试了所有的解决方案,但没有一个适合我.再次,我的网站运行正常,但我没有intellisense,并在我的视图中的很多东西下得到红色波浪线,Visual Studio无法识别,其中之一Html.BeginForm(),以及任何与之有关的东西ViewBag.

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

我的root中的web.config有以下行:

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

  <!-- ... -->
</system.web>
Run Code Online (Sandbox Code Playgroud)

我比较了之前没有使用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>
Run Code Online (Sandbox Code Playgroud)

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

实现上述之后,我现在有智能感知,但没有得到下的东西像任何未知的红色线条Html.BeginForm,ViewBag.Title等等.


小智 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>
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 5

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

  • 这消除了警告消息,但完全破坏了网站!我们在这里进行了大量的 MVC 开发,但我从未在 /shared 文件夹中看到过这些文件。 (2认同)