Windows更新后"命名空间'System.Web.Mvc'中不存在类型或命名空间名称'Html'"

Geo*_*uer 66 asp.net asp.net-mvc windows-update

我做了Windows更新,然后我的asp.net mvc 5应用程序将不再加载抱怨

CS0234: The type or namespace name 'Html' does not exist in the namespace 'System.Web.Mvc'
Run Code Online (Sandbox Code Playgroud)

表明我的观点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>
Run Code Online (Sandbox Code Playgroud)

现在这非常令人困惑.在我的项目本身,我可以看到Html命名空间,在ILSpy中打开我的程序集,我可以导航到绑定System.Web.Mvc,我也可以,并且融合日志没有显示任何可疑的绑定错误.

这就好像只是我的观点被绑定(成功)到旧版本的Mvc.为什么会发生这种情况?我该如何解决?

让我明确指出,没有配置甚至代码更改.这是我在IISExpress上的开发机器上的全部内容.它正在运行,我做了更新并重新启动,现在它不再运行了.

这是我最近安装的更新.我可以一个接一个地删除它们,但我想知道实际上出了什么问题,因为我觉得我错过了故事的一部分.

从更新安装

Geo*_*uer 118

神圣的废话,感谢@ Nevada-Williford的暗示.进入并设置我的System.Web.Mvc引用<Private>True</Private>(Copy Local = True)修复它.请注意,在更新之前一切正常,更新后我不得不修改我的csproj以使其再次运行.

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

Copy Local = True<Private>True</Private>曾经是差不多,但不完全是一回事.前者是Visual Studio设置,后者是msbuild设置.如果没有msbuild设置,则将应用Visual Studio设置(只要您在VS中).在此更新中,我认为他们更改了它,因此Copy Local只反映了presence属性.

在我们的项目中,我们没有明确设置该属性,Copy Local = True因此在将更新System.Web.Mvc.dll复制到bin目录之前.更新后,由于缺少属性Copy Local显示False,您必须将其设置为True以确保您获得本地副本.

手动设置Copy Local = True(或将该xml元素添加到msbuild)可以解决问题.

编辑:虽然这似乎是具体问题的答案,但是来到这里的任何人都应该阅读评论主题和其他答案 - 特别是dmatson的 - 以获取更多背景信息,警告和相关错误.

  • 哦,完全有意义并且变得更好,但是一个未经注意的带外更新需要更改现有代码?真是糟糕的形式. (2认同)
  • 值得注意的是,这也打破了已经设置了Copy Local = True的现有项目.至少对我来说,该项目不再在本地复制程序集.切换到Copy Local = false,保存,然后返回true并保存修复它. (2认同)

dma*_*son 32

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>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置CopyLocal=true在VS UI的项目引用,或手动添加下面的下面一行Reference在你的.csproj文件:

    <Private>True</Private>
    
    Run Code Online (Sandbox Code Playgroud)

因此,您的完整参考应如下所示:

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

请注意,如果将来再次更新软件包,NuGet将删除CopyLocal/Private设置.(例如,如果您今天更新到MVC 5.2).如果该版本的MVC是GAC,只要您在上面的步骤A中添加了配置,上述问题#1就不会重现,但问题#2仍然可能再次发生.为了确保将来不会发生这种情况,我建议您在进行NuGet包更新时手动将CopyLocal设置为true.

  • 神圣的牛太可怕了.每个人都请去投票那个nuget bug. (2认同)

Tua*_*DPH 9

  1. 您可以转到当前项目的参考.
  2. 右键单击dll,System.Web.Mvc然后选择"属性"
  3. 将打开"属性"窗口
  4. 将本地复制更改为True


use*_*Bee 5

设置CopyLocal = true没有帮助.清洁溶液然后关闭它并再次重新打开它.您可能还需要关闭整个Visual Studio实例.