Windows更新后“名称空间”System.Web.Mvc“中为什么不存在类型或名称空间名称'Html'”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (105)

我做了一个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,融合日志不会显示任何可疑的绑定错误。

这些都在IISExpress上的开发机器上。它正在运行,我做了更新并重新启动,现在不再运行。

以下是我最近从更新中安装的内容。我可以开始逐个删除它们,想知道实际发生了什么问题。

提问于
用户回答回答于

进入并设置我的System.Web.Mvc参考<Private>True</Private>(复制本地= True)修复它。请注意,在更新之前一切正常,在更新之后,我不得不修改我的csproj以使其再次运行。

关于发生了什么的工作理论:

Copy Local = True<Private>True</Private>曾经是差不多,但不完全是一回事。前者是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)可以解决问题。

用户回答回答于

对于MS14-059没有CopyLocal=true(或者在MSBuild讲话中<Private>True</Private>)的任何用户来说,这是被打破的。MVC模板默认设置,但如果您使用NuGet更新MVC版本,则会丢失该设置(请参阅NuGet bug#4344)。<Private>True</Private>

问题有两个方面:

  1. Razor默认不包含对MVC的引用,所以它的编译将不起作用,除非在您的bin文件夹中存在某个版本的MVC DLL。
  2. 如果您部署到未安装此更新的单独机器,则MVC DLL不再包含在您的输出中,因此MVC将会丢失。

看到问题#1。为了解决这两个问题,我建议进行以下两项更改:

  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>
  2. 设置CopyLocal=true在VS UI的项目引用,或手动添加下面的下面一行Reference在你的.csproj文件: <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'd的,则只要在上面的步骤A中添加了配置,但问题#2仍然可能再次发生,则上述问题#1不会再发生。为确保将来不会发生这种情况,我建议在任何时候执行NuGet软件包更新时手动将CopyLocal设置回true。

扫码关注云+社区

领取腾讯云代金券