我做了Windows更新,之后我的asp.net mvc 5应用程序将不再加载抱怨
CS0234: The type or namespace name 'Html' does not exist in the namespace 'System.Web.Mvc'
表示我的观点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" />
<add namespace="Ogre.Extensions" />
<add namespace="Newtonsoft.Json"/>
</namespaces>
</pages>
</system.web.webPages.razor>
现在这非常令人困惑。在我的项目本身,我可以看到Html
命名空间,在ILSpy中打开我的程序集我可以导航到绑定的System.Web.Mvc
,我也可以,并且融合日志没有显示任何可疑的绑定错误。
好像只是我的视图被绑定(成功)到旧版本的Mvc。为什么会发生这种情况?我该如何解决?
让我清楚的是,没有配置甚至代码更改。这是我在IISExpress上的开发机器上的全部内容。它正在运行,我进行了更新并重新启动,现在它已不再运行。
以下是我最近安装的更新内容。我可以一个接一个地删除它们,但我想知道实际上出了什么问题,因为我觉得我错过了故事的一部分。
答案 0 :(得分:117)
神圣的废话,感谢@ Nevada-Williford的暗示。进入并将我的System.Web.Mvc
引用设置为<Private>True</Private>
(复制本地= True)修复它。请注意,在更新之前一切正常,更新后我不得不修改我的csproj以使其再次运行。
关于正在发生的事情的工作理论:
Copy Local = True
和<Private>True</Private>
过去差不多,but not exactly, the same thing.前者是Visual Studio设置,后者是msbuild设置。如果没有msbuild设置,则将应用Visual Studio设置(只要您在VS中)。在此更新中,我认为他们对其进行了更改,因此Copy Local
仅反映了状态属性。
在我们的项目中,我们没有明确设置该属性,而是Copy Local = True
所以在更新System.Web.Mvc.dll
之前将其复制到bin目录。更新后,由于缺少该属性,Copy Local
会显示False
,您必须将其设置为True
以确保获得本地副本。
手动设置Copy Local = True
(或将该xml元素添加到msbuild)可以解决问题。
编辑:虽然这似乎是具体问题的答案,但是来到这里的任何人都应该阅读评论主题和其他答案 - 特别是dmatson的 - 以获取更多背景信息,警告和相关错误。< / p>
答案 1 :(得分:32)
对于没有CopyLocal=true
(或者,在MSBuild中,<Private>True</Private>
)MS14-059的用户,这已被中断。 MVC模板默认设置为<Private>True</Private>
,但如果使用NuGet更新MVC版本,则会丢失该设置(请参阅NuGet bug #4344)。
问题有两个方面:
您正在看问题#1。要解决这两个问题,我建议您进行以下两项更改:
将以下配置添加到Views \ Web.config:
<system.web>
<compilation>
<assemblies>
<add assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
</system.web>
在VS UI中为项目引用设置CopyLocal=true
,或在.csproj文件的Reference
中手动添加以下行:
<Private>True</Private>
因此,您的完整参考应如下所示:
<Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
</Reference>
请注意,如果将来再次更新软件包,NuGet将删除CopyLocal / Private设置。 (例如,如果您今天更新到MVC 5.2)。如果该版本的MVC曾经是GAC,那么只要您在上面的步骤A中添加了配置,上述问题#1就不会再发生,但问题#2仍然可能再次发生。为了确保将来不会发生这种情况,我建议您在每次进行NuGet包更新时手动将CopyLocal设置为true。
答案 2 :(得分:9)
System.Web.Mvc
并选择“属性”True
答案 3 :(得分:5)
设置CopyLocal = true没有帮助。清洁溶液然后关闭它并再次重新打开它。您可能还需要关闭整个Visual Studio实例。
答案 4 :(得分:4)
这似乎是由Windows Update(KB2990942)引起的,用于修复安全漏洞MS14-059,允许安全功能绕过。安装Windows Update后,我们的构建在我们的构建服务器上停止工作,并且更新csproj文件以使用4.0.0.1作为System.Web.Mvc引用修复了该问题。
Microsoft对此漏洞的描述是:
如果攻击者诱使用户单击特制链接或访问包含旨在利用此漏洞的特制内容的网页,则此漏洞可能允许安全功能绕过。在基于Web的攻击情形中,攻击者可能拥有一个旨在通过Web浏览器利用此漏洞的特制网站,然后诱使用户查看该网站。攻击者还可以利用受到破坏的网站和接受或托管用户提供的内容或广告的网站。这些网站可能包含可能利用此漏洞的特制内容。但是,在所有情况下,攻击者都无法强迫用户查看攻击者控制的内容。相反,攻击者必须说服用户采取行动,通常是让用户单击电子邮件或Instant Messenger消息中的链接,将其带到攻击者的网站,或者让他们打开附件通过电子邮件发送。
答案 5 :(得分:3)
除了在项目引用中设置CopyLocal = true之外,您可能还需要像这样更改Web.Config文件...
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
</dependentAssembly>
注意newVersion =“4.0.0.1”。这对我有用,我希望它也可以帮助一些人。
保存在任何测试/生产服务器上更新MVC框架。
干杯微软。你是最好的!
你在我的客户面前让我看起来无能为力的尝试又被挫败了!
答案 6 :(得分:1)
除了在项目参考中设置CopyLocal=true
之外,您可能还需要像这样更改 Web.Config 文件...
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
</dependentAssembly>
我还添加了culture="neutral"
,这一切都解决了这个问题。