命名空间 'System.Web' 中不存在类型或命名空间名称 'Mvc' .NET MVC 5 到 .NET Core 3.1 MVC 迁移

The type or namespace name 'Mvc' does not exist in the namespace 'System.Web' .NET MVC 5 to .NET Core 3.1 MVC Migration

我几乎完成了从 ASP.NET MVC 5 到 .NET Core 3.1 的迁移,但出现此错误,

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

错误出现在我的 /Views/Shared/Error.cshtml 视图中,我正在其中设置模型。

@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Error"
}

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

我已经删除了所有的 AspNetCore 包并重新添加它们,我已经尝试重新启动我的 Visual Studio (VS19),但都无济于事。

也许错误处理已从 .NET Core 中的 MVC 包中移出?这是我最好的猜测。

ASP.NET Core 3.1 中,MVC 应用程序 的主命名空间是 Microsoft.AspNetCore.Mvc。尝试使用它而不是 System.Web.Mvc.

ASP.NET 核心中的错误处理

也就是说,就特别是错误处理而言,该方法与 ASP.NET 框架 HandleErrorInfo 相比发生了很大变化class 不再存在。有关新方法的更多信息,请参阅 Handle errors in ASP.NET Core。例如,您现在使用 IExceptionHandlerPathFeature 的实现,而不是使用 HandleErrorInfo class 来检索有关异常的信息——尽管它比这要多一点,如文档。

迁移计划

最终,这只是您在迁移到 ASP.NET Core 时可能 运行 遇到的众多差异中的第一个。鉴于此,我建议您通读 Microsoft 的 Migrate from ASP.NET to ASP.NET Core 指南,该指南提供了有关更改内容以及如何进行迁移的有用摘要。

参考项目

此外,假设您正在使用 Visual Studio,我建议您创建一个新的 ASP.NET 核心 Web 应用程序 项目,它将创建一个基本的 ASP.NET Core 3.1 MVC 应用程序。在执行迁移时,这可能确实有用,因为它确定了“教科书”实现应该的样子,并为您提供了一个关于更改内容以及如何在新框架中解决类似问题的想法。

最后的想法

最终,ASP.NET Core 中的许多更改只是添加对正确 NuGet 的引用的问题包,更新命名空间,在少数情况下,更新代码以匹配 class 签名中的更改。尽管如此,仍有许多领域不再存在旧方法(以及支持它们的 classes)——就像这里的情况——因此需要额外的思考和关注。

积极地,很多 .NET Core 3.x 比以前的版本更容易,因为 Microsoft已经做了 ton 来缩小 .NET Framework.NET Core 之间的功能对等差距过去四年。而且,一旦您完成迁移,我想您会发现您的新网站更干净、更易于维护。