将从 ASP.NET MVC 迁移到 ASP.NET Core MVCMigrate from ASP.NET MVC to ASP.NET Core MVC

本文内容

作者: Rick AndersonDaniel RothSteve SmithScott Addie

本文介绍如何开始将 ASP.NET MVC 项目迁移到ASP.NET CORE mvc在此过程中,它突出显示了从 ASP.NET MVC 中更改的许多内容。从 ASP.NET MVC 迁移是一个多步骤过程,本文介绍了初始设置、基本控制器和视图、静态内容和客户端依赖关系。其他文章介绍了如何迁移在许多 ASP.NET MVC 项目中找到的配置和标识代码。

备注

示例中的版本号可能不是最新的。可能需要相应地更新项目。

创建 starter ASP.NET MVC 项目Create the starter ASP.NET MVC project

为了演示升级,我们首先创建一个 ASP.NET MVC 应用程序。创建名为WebApp1的命名空间,使命名空间与我们在下一步中创建的 ASP.NET Core 项目匹配。

Visual Studio“新建项目”对话框

"新建 Web 应用程序" 对话框:在 "ASP.NET 模板" 面板中选择的 MVC 项目模板

可选: 将解决方案的名称从WebApp1更改为Mvc5Visual Studio 将显示新的解决方案名称(Mvc5),这样就可以更轻松地从下一个项目通知此项目。

创建 ASP.NET Core 项目Create the ASP.NET Core project

使用与上一个项目相同的名称创建新的空_ASP.NET Core web 应用(_WebApp1),以便两个项目中的命名空间匹配。通过具有相同的命名空间,可以更轻松地在两个项目之间复制代码。必须在与上一个项目相同的目录中创建此项目。

“新建项目”对话框

新建 ASP.NET Web 应用程序对话框: 在 ASP.NET Core 模板面板中选择的空项目模板

  • 可选: 使用 " Web 应用程序" 项目模板创建新的 ASP.NET Core 应用程序。将项目命名为 " WebApp1",并选择单个用户帐户的身份验证选项。将此应用重命名为FullAspNetCore。创建此项目可在转换时节省时间。您可以查看模板生成的代码以查看最终结果或将代码复制到转换项目。当您停滞转换步骤以与模板生成的项目进行比较时,这也很有用。

将站点配置为使用 MVCConfigure the site to use MVC

  • 面向 .NET Core 时,默认情况下将引用AspNetCore 元包。此包包含 MVC 应用通常使用的包。如果目标 .NET Framework,则包引用必须单独列出在项目文件中。
  • 面向 .NET Core 时,默认情况下将引用AspNetCore。此包包含由 MVC 应用程序使用的包。如果目标 .NET Framework,则包引用必须单独列出在项目文件中。
  • 面向 .NET Core 或 .NET Framework 时,将在项目文件中单独列出包由 MVC 应用程序使用的常用包。

Microsoft.AspNetCore.Mvc 是 ASP.NET Core MVC 框架。Microsoft.AspNetCore.StaticFiles 是静态文件处理程序。ASP.NET Core 运行时是模块化的,你必须明确选择提供静态文件(请参阅静态文件)。

  • 打开Startup.cs文件并更改代码,使其与以下内容匹配:
  1. using Microsoft.AspNetCore.Builder;
  2. using Microsoft.AspNetCore.Hosting;
  3. using Microsoft.Extensions.DependencyInjection;
  4. namespace WebApp1
  5. {
  6. public class Startup
  7. {
  8. // This method gets called by the runtime. Use this method to add services to the container.
  9. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
  10. public void ConfigureServices(IServiceCollection services)
  11. {
  12. services.AddMvc();
  13. }
  14. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  15. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  16. {
  17. if (env.IsDevelopment())
  18. {
  19. app.UseDeveloperExceptionPage();
  20. }
  21. app.UseStaticFiles();
  22. app.UseMvc(routes =>
  23. {
  24. routes.MapRoute(
  25. name: "default",
  26. template: "{controller=Home}/{action=Index}/{id?}");
  27. });
  28. }
  29. }
  30. }

UseStaticFiles 扩展方法添加静态文件处理程序。如前所述,ASP.NET 运行时是模块化的,你必须明确选择提供静态文件。UseMvc 扩展方法将添加路由。有关详细信息,请参阅应用程序启动路由

添加控制器和视图Add a controller and view

在本部分中,你将添加一个最小控制器和视图,用作 ASP.NET MVC 控制器的占位符,以及将在下一部分中迁移的视图。

  • 添加 "控制器" 文件夹。

  • 将名为HomeController.cs控制器类添加到 "控制器" 文件夹。

“添加新项”对话框

  • 添加Views文件夹。

  • 添加 "视图"/"主文件夹"。

  • 将名为IndexRazor 视图添加到Views/Home文件夹中。

“添加新项”对话框

项目结构如下所示:

显示 WebApp1 的文件和文件夹的解决方案资源管理器

Views/Home/Index. cshtml文件的内容替换为以下内容:

  1. <h1>Hello world!</h1>

运行应用。

在 Microsoft Edge 中打开的 Web 应用

有关详细信息,请参阅控制器视图

现在,我们已最小的工作 ASP.NET Core 项目,我们可以开始从 ASP.NET MVC 项目迁移功能。我们需要移动以下内容:

  • 客户端内容(CSS、字体和脚本)

  • 控制器

  • 视图

  • 模型

  • 销售

  • 筛选器

  • 登录/注销、标识(在下一教程中完成此操作。)

控制器和视图Controllers and views

  • 将 ASP.NET MVC HomeController 中的每个方法复制到新 HomeController。请注意,在 ASP.NET MVC 中,内置模板的控制器操作方法返回类型为ActionResult.aspx);在 ASP.NET Core MVC 中,操作方法改为返回 IActionResultActionResult 实现 IActionResult,因此无需更改操作方法的返回类型。

  • 将 "关于__"、"ASP.NET" 和"索引" Razor 视图文件复制到 ASP.NET Core 项目。

  • 运行 ASP.NET Core 应用和测试每个方法。尚未迁移布局文件或样式,因此呈现的视图仅包含视图文件中的内容。你没有 AboutContact 视图的布局文件生成链接,因此你必须从浏览器调用它们(将4492替换为项目中使用的端口号)。

联系人页

请注意缺少样式和菜单项。此问题将在下一部分得以解决。

静态内容Static content

在以前版本的 ASP.NET MVC 中,静态内容是从 web 项目的根托管的,与服务器端文件混合。在 ASP.NET Core 中,静态内容承载于wwwroot文件夹中。需要将静态内容从旧的 ASP.NET MVC 应用复制到 ASP.NET Core 项目中的wwwroot文件夹。在此示例转换中:

  • 将旧 MVC 项目中的favicon文件复制到 ASP.NET Core 项目中的wwwroot文件夹。

旧的 ASP.NET MVC 项目使用启动来设置其样式,并将启动文件存储在 "内容" 和 "脚本" 文件夹中。生成旧的 ASP.NET MVC 项目的模板引用布局文件(Views/Shared/_Layout)中的启动。可以将 ASP.NET MVC 项目中的node.js启动 .css文件复制到新项目中的wwwroot文件夹。相反,我们将在下一节中使用 Cdn 添加对启动(和其他客户端库)的支持。

迁移布局文件Migrate the layout file

  • ViewStart的 ASP.NET 文件从旧的 MVC 项目的_views文件夹复制到 ASP.NET Core 项目的views文件夹中。未在 ASP.NET Core MVC 中更改 ViewStart cshtml_文件。

  • 创建视图/共享文件夹。

  • 可选:FullAspNetCore MVC 项目的views文件夹中 ViewImports为 ASP.NET Core 项目的_views文件夹。删除 ViewImports cshtml文件中的任何命名空间声明。__ViewImports 的 cshtml文件提供所有视图文件的命名空间,并提供标记帮助程序。标记帮助程序在新的布局文件中使用。_ViewImports ASP.NET Core 的新文件。

  • _Layout的 ASP.NET 文件从旧的 MVC 项目的视图/共享文件夹复制到 ASP.NET Core 项目的视图/共享文件夹中。

打开 _Layout 的 cshtml文件并进行以下更改(完成的代码如下所示):

  • @Styles.Render("~/Content/css") 替换为 <link> 元素以加载启动 .css (请参阅下文)。

  • 删除 @Scripts.Render("~/bundles/modernizr")

  • 注释掉 @Html.Partial("_LoginPartial") 行(将行括在 @@)。有关详细信息,请参阅将身份验证和标识迁移到 ASP.NET Core

  • @Scripts.Render("~/bundles/jquery") 替换为 <script> 元素(见下文)。

  • @Scripts.Render("~/bundles/bootstrap") 替换为 <script> 元素(见下文)。

用于启动 CSS 的替换标记包含:

  1. <link rel="stylesheet"
  2. href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
  3. integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
  4. crossorigin="anonymous">

JQuery 和启动 JavaScript 的替换标记包含:

  1. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  2. <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
  3. integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

更新后的 _Layout cshtml文件如下所示:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>@ViewBag.Title - My ASP.NET Application</title>
  7. <link rel="stylesheet"
  8. href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
  9. integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
  10. crossorigin="anonymous">
  11. </head>
  12. <body>
  13. <div class="navbar navbar-inverse navbar-fixed-top">
  14. <div class="container">
  15. <div class="navbar-header">
  16. <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
  17. <span class="icon-bar"></span>
  18. <span class="icon-bar"></span>
  19. <span class="icon-bar"></span>
  20. </button>
  21. @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
  22. </div>
  23. <div class="navbar-collapse collapse">
  24. <ul class="nav navbar-nav">
  25. <li>@Html.ActionLink("Home", "Index", "Home")</li>
  26. <li>@Html.ActionLink("About", "About", "Home")</li>
  27. <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
  28. </ul>
  29. @*@Html.Partial("_LoginPartial")*@
  30. </div>
  31. </div>
  32. </div>
  33. <div class="container body-content">
  34. @RenderBody()
  35. <hr />
  36. <footer>
  37. <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
  38. </footer>
  39. </div>
  40. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  41. <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
  42. integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
  43. crossorigin="anonymous"></script>
  44. @RenderSection("scripts", required: false)
  45. </body>
  46. </html>

在浏览器中查看站点。它现在应正确加载,并具有所需的样式。

  • 可选: 你可能想要尝试使用新的布局文件。对于此项目,您可以从FullAspNetCore项目复制布局文件。新的布局文件使用标记帮助程序,并具有其他改进功能。

配置捆绑和缩减Configure bundling and minification

有关如何配置绑定和缩减的信息,请参阅捆绑和缩减

解决 HTTP 500 错误Solve HTTP 500 errors

有许多问题可能会导致 HTTP 500 错误消息,其中不包含问题根源的相关信息。例如,如果Views/_ViewImports cshtml文件包含项目中不存在的命名空间,则会收到 HTTP 500 错误。默认情况下,在 ASP.NET Core 应用中,UseDeveloperExceptionPage 扩展将添加到 IApplicationBuilder,并在配置为开发时执行。下面的代码对此进行了详细说明:

  1. using Microsoft.AspNetCore.Builder;
  2. using Microsoft.AspNetCore.Hosting;
  3. using Microsoft.Extensions.DependencyInjection;
  4. namespace WebApp1
  5. {
  6. public class Startup
  7. {
  8. // This method gets called by the runtime. Use this method to add services to the container.
  9. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
  10. public void ConfigureServices(IServiceCollection services)
  11. {
  12. services.AddMvc();
  13. }
  14. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  15. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  16. {
  17. if (env.IsDevelopment())
  18. {
  19. app.UseDeveloperExceptionPage();
  20. }
  21. app.UseStaticFiles();
  22. app.UseMvc(routes =>
  23. {
  24. routes.MapRoute(
  25. name: "default",
  26. template: "{controller=Home}/{action=Index}/{id?}");
  27. });
  28. }
  29. }
  30. }

ASP.NET Core 将在 web 应用程序中未经处理的异常转换为 HTTP 500 错误响应。通常,这些响应中不包含错误详细信息,以防止泄露有关服务器的可能敏感信息。有关详细信息,请参阅 "处理错误" 中的使用开发者异常页

其他资源Additional resources