命名空间'System.Web.Mvc'中不存在类型或命名空间名称。

224

在构建MVC3解决方案时没有问题,但浏览器出现了错误:

编译器错误消息:CS0234:名称空间'System.Web.Mvc'中不存在类型或命名空间名称'Html'(是否缺少程序集引用?)

Source Error:
Line 25:         <add namespace="System.Web.Mvc" />
Line 26:         <!--<add namespace="System.Web.Mvc.Ajax" />-->
Line 27:         <add namespace="System.Web.Mvc.Html" />
Line 28:         <add namespace="System.Web.Routing" />
Line 29:         <add namespace="System.Web.WebPages" />

我已经使用NuGet安装了解决方案所需的包,并为所有项目设置了MVC3MVC3是否包括库System.Web.Mvc.AjaxSystem.Web.Mvc.Html等?为什么会出现错误?


在引用文件夹中,我有System.Web.Mvc

运行时版本:v4.0.30319

Version: 3.0.0.0

Web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    <add key="webpages:Version" value="1.0.0.0" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>
    <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>
    <httpRuntime targetFramework="4.5" encoderType="System.Web.Security.AntiXss.AntiXssEncoder, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <machineKey compatibilityMode="Framework45" />
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <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>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
  <connectionStrings>
    <add name="EFDbContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=SportStore;Integrated Security=True;Pooling=False;" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

MSDN 是关于 System.Web.Mvc 命名空间的文档。

文件 packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0-rc" />
  <package id="jQuery" version="1.7.2" />
  <package id="jQuery.UI.Combined" version="1.8.11" />
  <package id="jQuery.Validation" version="1.9" />
  <package id="Microsoft.AspNet.Mvc" version="3.0.20105.1" />
  <package id="Microsoft.AspNet.Providers.Core" version="1.0" />
  <package id="Microsoft.AspNet.Providers.LocalDB" version="1.0" />
  <package id="Microsoft.AspNet.Razor" version="1.0.20105.408" />
  <package id="Microsoft.AspNet.WebPages" version="1.0.20105.408" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" />
  <package id="Modernizr" version="2.0.6" />
  <package id="Moq" version="4.0.10827" />
  <package id="Ninject" version="3.0.1.10" />
</packages>

1
你的网络服务器是什么?这是在IIS中吗? - Daniel A. White
1
你的项目目标设置为什么? - Daniel A. White
2
取决于谁看到这个问题 - 对我们中的一些人来说,这就是所需的全部。管理解决方案的Nuget包...>>更新 - Tom Stickel
是的,在2013年的VS中,使用net4.5版本,勾选了MVC框架后也遇到了同样的问题。Danny的建议对我很有用。进入项目引用,找到System.Web.Mvc,将本地副本设置为true。清理并重新构建即可。 - Kagan Agun
显示剩余2条评论
23个回答

427

清理您的解决方案,然后将这些文件的属性设置为 Copy Local = True

如何设置 Copy Local 属性为 True 或 False:

在“解决方案资源管理器”中,单击“显示所有文件”按钮以显示“引用”节点。

  • 展开该项目的“引用”节点。
  • 右键单击“引用列表”中的一个引用,然后单击“属性”。与该引用相关的属性将在“属性”窗口中的列表中显示。
  • 在“属性”窗口中,将 Copy Local 属性更改为 True 或 False。

11
太棒了!这对我的MVC4项目有所帮助。当你想到它时,它似乎很明显。我从未查看部署的项目以查看DLL是否存在。 - Alex Kilpatrick
1
不客气。有时候,复杂的问题也可以用简单的方法解决。 :) - Toffee
1
@Dusht一旦您在项目中选择引用,您应该在属性窗口中看到它-http://postimg.org/image/mhy8glihd/ - stuartd
5
成功了!我只改了一个引用 => System.Web.Mvc - Jaider
5
花了一点时间才明白“那些文件”是什么意思。请检查解决方案中每个项目的程序集引用,任何路径中带有“Microsoft ASP.NET\ASP.NET MVC 3\Assemblies”或类似内容的都可能是问题所在。 - Task
显示剩余14条评论

61

不知何故,我有两个解决方案的 web 项目在某种情况下自动卸载了 asp.net MVC。我从 NuGet 安装了它,现在它们都可以正常工作。这是在一个最近的批量 Windows 更新之后发生的,其中包括我使用的 .net framework 版本(4.5.1)的更新。

编辑:来自.Net Web 开发和工具博客:

Microsoft Asp.Net MVC 安全更新 MS14-059 破坏了我的构建!


4
这正好发生在我身上。不过,我更新了我的MVC(模型-视图-控制器)软件包,而不是重新安装它们(我的版本已经过时了)。这是为什么会发生的原因或来源? - Joshua H
5
根据您所引用的MVC版本(分别为5.1和5.0),这似乎与KB2994379或KB2992080有关。此更新提供了一个新版本的System.Web.Mvc,我认为这可能会引入版本冲突。更新您的MVC包将修复错误。如果由于任何原因无法进行更新,则需要将System.Web.Mvc.dll设置为本地复制。 - Vinney Kelly
2
我也遇到了同样的问题。更新包并将复制本地设置为true。谢谢大家!!! - Vackup
1
MVC复制本地 = true +1. - Stanomatic
4
我经历了同样的情况。必须将MVC设置为copy local = FALSE,重新生成,再将copy local = TRUE,重新生成。一切都好了。 - Jeppebm
显示剩余4条评论

38

当我从IIS运行并且默认站点的应用程序池设置为.NET版本2.0时,这通常会让我遇到问题。使用Visual Studio中的IIS时,它会创建一个虚拟目录但仍在默认站点的应用程序池下运行。 如果使用内置的Web服务器,请右键单击您的Web项目,进入属性,并确保在正确的.NET版本下运行。 在IIS上检查您的应用程序池中的.NET版本。

接着我的最后一条评论关于项目如何创建的 - 你是否正确地包括了组件,如下所示(取自VS10 MVC3项目模板生成的默认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>

2
所有项目都设置为使用.NET Framework 4.5。这是否意味着.NET 4.5无法找到System.Web.Mvc.Ajax和其他类? - J.Olufsen
通常情况下,这意味着它被设置为运行为4.5,但实际上正在以其他方式运行,这意味着它无法在System.Web.Mvc中找到System.Web.Mvc.Ajax。 - BlackSpy
顺便问一下,你的System.Web.dll版本是多少?我问这个的原因是你说你从NuGet添加了程序集 - 你没有创建MVC3 Web项目吗? - BlackSpy

33

您需要更新MVC。

  1. 转到工具 -> NuGet软件包管理器 -> 管理解决方案的NuGet软件包
  2. 点击“更新”
  3. 更新“Microsoft ASP.NET MVC”
  4. 重建解决方案

1
使用 NuGet 软件包是好的,但它可能会下载一堆不必要的程序集,但这样做可以解决问题。 - Canvas
1
遇到了同样的问题,有一些赏金。 - Etheryte

28

我也遇到了同样的问题 - 我是将新的 System.Web.Mvc.dll 引用到一个 lib 文件夹中,但我没有设置 "Copy Local" 为 true。应用程序于是回滚到 GAC 中的旧版本,它里面的正确名称空间(Html、Ajax 等)不可用,然后就导致了运行时错误。


16

我的解决方案是在“管理解决方案的Nuget包...”下--我有很多包要更新。

让我先退一步,我把解决方案和项目从一个文件夹移动到另一个文件夹,所以事情已经与项目认为的不一样了。虽然所有东西都移动得很好,但显然Nuget会感到困惑,除非你使用与我不同的方法。

回到解决方案...我只需进入“管理解决方案的Nuget包...” >> “更新” >> “Microsoft和.NET” ,并点击“全部更新”按钮。

一切恢复正常并且愉快。


我发布了同样类型的解决方案,无意中跳过了你的帖子。+1 给你。 - Tom Stickel
这对我也是解决方法。 - bradj
请注意,在执行此操作后,您可能还需要更新JQuery和Bootstrap。 - Carl Onager
在一个MVC5项目中,更新mvc、razor和webpages nuget包对我有用。 - voam

9
在NuGet包管理器中运行以下命令,这对我有所帮助:
update-package microsoft.aspnet.mvc -reinstall

2
这需要再赞一千次。 - Chazt3n
1
@Chazt3n 对我没用,但这是个好建议,所以点赞 +1。 - Jared Beach
1
我尝试了所有其他方法,技术上使用包管理器,卸载、重新安装和更新等等。所以我对这个答案持悲观态度,但又非常绝望。不知怎么的,这个方法奏效了。 - Mahesh

9

我下载了一个MVC 5项目,问题出现在以下位置:

<add namespace="System.Web.Mvc.Ajax" />  

出现以下错误信息:

CS0234: The type or namespace name 'Ajax' does not exist in the namespace 'System.Web.Mvc' (are you missing an assembly reference?)

--> 在我访问这个网页并尝试了清理和一些其他操作后,以下方法对我有效:

直接

Manage Nuget and Update all the packages.  Then it worked fine.

1
哦,我会撤下我的帖子,但我看到azarc3已经说了同样的话。我会给他点赞。 - Tom Stickel

6
这个答案有点晚,但有人可能会发现它有用。
在本地项目中的Visual Studio 2012上,Net Framework 4.5 MVC 4中,以上解决方案都对我没起作用。为了更好的理解,我正在按照CodeProject上创建一个最简Web Api的教程操作(http://www.codeproject.com/Articles/615805/Creating-a-Clean-Minimal-Footprint-ASP-NET-WebAPI),当我遇到这个问题时。
对我有用的是将 "System.Web.Mvc" 明确添加到我的应用程序引用中,即使该应用程序已经引用了 "System.Web"。

谢谢。这解决了我的问题(尽管它与DevExpress.Web.Mvc有关)。 - dferraro
+1. 我正在使用MvcSiteMapProvider,由于它不支持最新的MVC程序集,我无法通过nuget进行“全部更新”Microsoft ASP.Net MVC包。另一个建议是您可能需要为此程序集执行“CopyLocal=True”。 - user007
只需要将调试 Web 应用程序推送到新环境。需要在引用中添加“复制本地”。 - dudeNumber4

4

我曾经遇到过同样的问题,但以上方法都没能解决。不过它们确实让我找到了正确的方向。

例如,当我将 System.Web.Mvc 的“复制本地”设置为“true”时,它会自动将其设置为 False。

我有多个依赖于 System.Web.Mvc 引用的项目,但只有一个引起了这个问题。在 VS 2012 中,这个引用标有黄色的注意三角形。

找到这个引用 => 移除它 => 重新添加它

这对我很有效。希望对你也有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接