为什么System.Web.Mvc未在“添加引用”中列出?


132

使用C#,Visual Studio 2010。

MSDN上记录了一个名为System.Web.Mvc的命名空间。该名称空间中所有类型的文档都说它们在中System.Web.Mvc.dll

但是,当我转到“添加引用”的“ .NET”选项卡时,列表中缺少该程序集。为什么?


1
您能否澄清:您的项目在没有该参考的情况下是否有效?它在您的web.config中吗(请参阅我的答案)?
基本

4
我没有从事任何项目。我只是想在StackOverflow上帮助某人。我通常会添加参考,以查看任何类型的IntelliSense和/或F12。在这种情况下,列表中缺少所需的程序集,所以我问为什么。
Timwi's

1
致此页面的读者注意-截至今天(2015-02-09),解决该问题的方法已随着时间而改变-阅读所有答案-各种版本的VS.NET和.NET Framework会将MVC引用的代码移入到不同的地方。
qxotk

Answers:


106

在VS Express 2012中,我在“程序集”选项卡中找不到System.Web.Mvc,但是经过一番搜索,我发现我需要查看“ 程序集\扩展名 ”选项卡,而不是默认的“程序集\框架” “ 标签。


1
为您+1,因为您找到了我遇到的问题的根本原因。我选择使用下面规定的NuGet安装方法,在这里我会做些评论。
qxotk

我在Visual Studio Community 2015中尝试了此方法,但是遇到了与版本不兼容(Could not load file or assembly...The located assembly's manifest definition does not match the assembly reference)相关的运行时错误。我的解决方案中有另一个项目引用了另一个版本,该方法仅允许我添加对System.Web.Mvc的引用,即Version = 4.0.0.0。NuGet安装方法添加了正确的版本
NJS

100

最好的方法是使用NuGet软件包管理器。

只需更新下面的MVC软件包,它就可以工作。

在此处输入图片说明


4
我必须承认,这是在大多数情况下添加对MVC的引用的正确方法(这应该避免您在Visual Studio之外运行应用程序的问题,这可能会导致错误引用)。但是,在已经包含某些MVC的大型解决方案中,使用“管理解决方案的NuGet软件包”来安装相同版本的库会更好。原因是,如果仅从NuGet软件包管理器安装它们,则可能会导致版本不兼容(该管理器通常会为您提供最新版本)。
jahu 2015年

2
我已将该解决方案用于无法使用Visual Studio 2015编译的MVC 4项目。它还可以确保项目库在所有开发人员中都是统一的。
ceetheman 2015年

1
我的盒子上只有VS2015,而其他团队成员有VS2013,则可能遇到这个问题-可能让他们引用旧位置(无构建错误),而我没有代码和构建错误。值得注意的是,到目前为止,我找不到Microsoft.Web.Mvc-这是导致此问题的引用。@forderah的回答揭示了NuGet中名称不同的事实。Microsoft.Web.Mvc现在是Microsoft.AspNet.Mvc,它也提取其答案中列出的依赖项。
qxotk

1
我什至在VS2017中遇到了这个问题,并解决了这个问题。不知道为什么VS2017告诉我,它认为实际上要查找Microsoft.AspNet.Mvc时需要引用的程序集是System.Web.Mvc
Michael Davidson

60

我遇到了同样的问题,无法找到System.Web.MVC参考程序集。

最终发现它位于以下位置。

请注意,如果您的VS安装在C:中(有时MVC.dll不在每个人都谈论的默认位置,我的意思是位于C:驱动器中的“ Reference Assemblys ”文件夹。)

如果不存在,则绝对应该在这里:

\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET MVC 2 \ Assemblies \ System.Web.Mvc.dll

因此,通过导航或添加引用菜单中的浏览选项卡添加dll。


1
尽管我确定我之前已经通过Framework Assemblies列表添加了此参考,但这为我提供了参考。
Zarepheth 2013年

9
如果您与VCS一起工作,那不是一个很好的解决方案。在这种情况下,绝对路径是邪恶的。
丹尼斯的威胁2014年

绝对同意,由于硬编码的绝对路径依赖性,这在任何类型的团队开发环境中都是一个不好的解决方案。
Craig 2015年

解决该问题的方法是确保每个人都为DLL使用相同的路径。如果所有团队成员都按原样在该位置安装了组件,那应该没有问题。另外,也可以从该路径复制DLL,并将其直接放置到项目中,因此它具有相对路径。但是,无论哪种方式,只要知道DLL所在的位置,都是一个不错的起点。
vapcguy

这确实有所帮助;但是Microsoft应该使它变得更加干净和容易
。...– JosephDoggie

28

您也可以从Nuget软件包管理器控制台中添加它,例如:

Install-Package Microsoft.AspNet.Mvc -Version 4.0.20710.0 -ProjectName XXXXX

Microsoft.AspNet.Mvc依赖于:

  • 'Microsoft.AspNet.WebPages(≥2.0.20710.0 && <2.1)'
  • 'Microsoft.Web.Infrastructure(≥1.0.0.0)'
  • 'Microsoft.AspNet.Razor(≥2.0.20710.0 && <2.1)'

...对我来说似乎并不算大事。在我们的案例中,这是一个类库,仅用于为我们的Mvc应用程序提供支持。因此,我们认为这是最坏的情况。

我绝对希望这指向文件系统或GAC上的程序集,因为将来更新程序包可能比过去我对GAC和文件系统程序集引用所经历的痛苦要轻得多。


1
我使用了这种方法,并且我同意在引用中不使用局部绝对路径。我使用了NuGet程序包管理器,添加了程序包和依赖项,从而在仅VS2015的盒子上解决了该问题。
qxotk

11

我遇到了同样的问题,这是一个有趣的原因:我的猜测是,您希望System.Web.Mvc位于System.Web列表的下面。但是该列表不是按字母顺序排列的。

首先对列表进行排序,然后查看System.Web


1
还要确保获得正确的版本。在我的情况下,System.Web.Mvc v2和v4在那里,并且它们也不彼此相邻。
TTT

出于相同原因,在查找System.Web.Mvc时遇到了相同的问题。我改用Microsoft.AspNet.Mvc,以确保检查解决方案中的其他项目使用的版本号。
qxotk

5

“好的,可以将XML添加到Web.config中,但是它不能解决问题”

它应该在那里。默认情况下,添加引用列表似乎是有序的,但事实并非如此。点击名称标题,然后再次查看。


除非我确定,否则我通常不会说“列表中缺少该程序集”。
Timwi

我想出了@Timwi,但给出了另一个答案,即是v。几乎没有安装vs 2010的机会,而就我而言,我始终在引用列表中找到了我所需要的,而没有碰到我拥有的名称标头说出来......其实,我现在知道为什么我从来没有之前和VS 2010我-看到的第一个评论:weblogs.asp.net/scottgu/archive/2009/10/29/...
eglasius

那么,您是说单击“名称”标题为您排序吗?我的机器上什么也没做...
Roman Starkov

1
@romkyns仅在列表中的所有程序集都已加载后才起作用。
eglasius

5

检查以下步骤:

  1. 检查MVC是否正确安装。
  2. 检查项目的属性,看看什么是项目目标框架。如果目标框架未设置为.Net Framework 4,则进行设置。

注意:如果目标框架设置为.Net Framework 4客户端配置文件,则不会在引用列表中列出MVC参考。您可以在此处找到.Net Framework 4和.Net Framework 4客户端配置文件之间的区别。

.NET Framework 4客户端配置文件是为客户端应用程序优化的.NET Framework 4的子集。它为大多数客户端应用程序提供功能,包括Windows Presentation Foundation(WPF),Windows窗体,Windows Communication Foundation(WCF)和ClickOnce功能。这样可以为面向.NET Framework 4客户端配置文件的应用程序提供更快的部署和更小的安装包。


这是一个很好的提示。当我转到项目的属性时,它仅列出.NET Core 1和2。没有.NET Framework4.x。我在列表中缺少程序集。事实证明,这就是我构建项目的方式-我选择了错误的选项-使用.NET Core而不是.NET Framework。现在我知道了区别。:)
vapcguy

4

我通过搜索“ mvc”解决了这个问题。System.Web.Mvc出现在搜索结果中,尽管它没有包含在列表中。


3

现在所需的程序集已出现在列表中。

我只能推测是什么导致了它的出现,但是我怀疑这是我进入了FileNewProjectASP.NET Web Application的事实,这是我以前从未做过的。这有可能导致某种形式的后期初始化发生,并在列表中填充用于Web开发的其他程序集。


它肯定一直都在那儿,它还可以:P ...看到我在答案中添加的评论,它在链接中说:“。net选项卡的问题是,异步正在发生并且正在刷新,而不是按字母顺序排序...“ ...这是vs 2010的新行为,直到我看到您的问题,我才意识到这一点。
eglasius 2010年

@egl我刚刚在这里(VS2010)在我的机器上测试过,它根本不在列表中。根据目标框架,我确实得到了不同的程序集集,但是这一套从未出现过。
罗曼·斯塔科夫

@romkyns尝试以.net 4为目标,并执行我在回答中提到的内容。另外,由于它会进行异步加载,因此请确保给它足够的加载时间。
eglasius

2

对于Visual Studio 2012,这已更改(我知道原始问题为VS2010,但标题仍会在搜索中出现)。

创建VS2012 MVC项目时,将system.web.mvc放在解决方案对等的packages文件夹中。默认情况下,该项目将在Web项目中引用,您可以在其中找到确切的路径。

如果要在辅助项目中引用它(例如带有过滤器或其他属性的支持.dll),则可以从那里引用它。


2

我在VS 2012中没有获得System.Web.Mvc,但在VS 2013中获得了它。使用AddReference对话框, 在此处输入图片说明

或者,您可以在项目路径中找到它,

YourProjectName \ packages \ Microsoft.AspNet.Mvc.5.0.0 \ lib \ net45 \ System.Web.Mvc.dll


很棒的技巧,它显示了在现有项目路径中可以找到的位置。谢谢!
艾伦(Alan)

0

我相信您会发现在web.config文件中而不是在项目本身中引用了MVC程序集。

像这样:

<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.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  </assemblies>
</compilation>

回应您的评论;

我能给的最好的答案是从这里

add元素添加要在动态资源编译期间使用的程序集引用。编译每个代码模块时,ASP.NET会自动将此程序集链接到资源。


好的,可以将XML添加到Web.config中,但是它不能解决问题。
Timwi

“作品”是否提供了智能感知?我已经编辑我的答案
基本

0

它可以单独安装,并且不包含在框架中,选择选项卡列表“扩展”,并且它存在并且还有更多其他的lib,使用旧的lib等都不需要,所有的都存在old 20 30和4001


0

如果您在Visual Studio 2017中遇到此问题,则很可能您正在使用在VS的早期版本中创建的MVC 4项目,该项目的参考提示路径指向 C:\Program Files (x86)\Microsoft ASP.NET。Visual Studio 2017不再安装此目录。

我们通常通过在2017实例旁边安装Visual Studio 2015副本来解决此问题,并在上​​述路径中安装必要的库。然后,我们更新受影响项目中的所有参考,一切顺利。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.