- 概述
- 新增功能
- 基础知识
- 测试、调试和疑难解答
- 低版本升级迁移
将从 ASP.NET MVC 迁移到 ASP.NET Core MVC
作者: Rick Anderson、 Daniel Roth、 Steve Smith和Scott Addie
这篇文章演示如何开始迁移到 ASP.NET MVC 项目ASP.NET Core MVC。 在此过程中, 它突出显示了从 ASP.NET MVC 中更改的许多内容。 从 ASP.NET MVC 迁移是一个多步骤过程, 本文介绍了初始设置、基本控制器和视图、静态内容和客户端依赖关系。 其他文章介绍了如何迁移在许多 ASP.NET MVC 项目中找到的配置和标识代码。
备注
示例中的版本号可能不是最新的。 可能需要相应地更新项目。
创建 starter ASP.NET MVC 项目
为了演示升级, 我们首先创建一个 ASP.NET MVC 应用程序。 创建同名WebApp1使命名空间匹配我们在下一步中创建 ASP.NET Core 项目。
可有可无将解决方案的名称从WebApp1更改为Mvc5。 Visual Studio 将显示新的解决方案名称 (Mvc5), 这样就可以更轻松地从下一个项目通知此项目。
创建 ASP.NET Core 项目
创建一个新空ASP.NET Core 与以前的项目同名的 web 应用 (WebApp1) 以便将两个项目中的命名空间匹配。 通过具有相同的命名空间, 可以更轻松地在两个项目之间复制代码。 必须在与上一个项目相同的目录中创建此项目。
- 可有可无使用 " Web 应用程序" 项目模板创建新的 ASP.NET Core 应用程序。 将项目命名为 " WebApp1", 并选择单个用户帐户的身份验证选项。 将此应用重命名为FullAspNetCore。 创建此项目可在转换时节省时间。 您可以查看模板生成的代码以查看最终结果或将代码复制到转换项目。 当您停滞转换步骤以与模板生成的项目进行比较时, 这也很有用。
将站点配置为使用 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文件并更改代码, 使其与以下内容匹配:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; namespace WebApp1 { public class Startup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } }
UseStaticFiles
扩展方法添加静态文件处理程序。 如前所述, ASP.NET 运行时是模块化的, 你必须明确选择提供静态文件。 UseMvc
扩展方法将添加路由。 有关详细信息, 请参阅应用程序启动和路由。
添加控制器和视图
在本部分中, 你将添加一个最小控制器和视图, 用作 ASP.NET MVC 控制器的占位符, 以及将在下一部分中迁移的视图。
添加 "控制器" 文件夹。
将名为HomeController.cs的控制器类添加到 "控制器" 文件夹。
添加Views文件夹。
添加 "视图"/"主文件夹"。
将名为Index的Razor 视图添加到Views/Home文件夹中。
项目结构如下所示:
将Views/Home/Index. cshtml文件的内容替换为以下内容:
<h1>Hello world!</h1>
运行应用。
现在,我们已最小的工作 ASP.NET Core 项目,我们可以开始从 ASP.NET MVC 项目迁移功能。 我们需要移动以下内容:
客户端内容 (CSS、字体和脚本)
控制器
视图
模型
销售
筛选器
登录/注销、标识 (在下一教程中完成此操作。)
控制器和视图
将 ASP.NET MVC
HomeController
中的每个方法复制到新HomeController
的。 请注意,在 ASP.NET MVC 内置模板的控制器操作方法的返回类型ActionResult; 在 ASP.NET Core MVC,操作方法返回IActionResult
相反。ActionResult
实现IActionResult
, 因此无需更改操作方法的返回类型。复制About.cshtml, Contact.cshtml,和Index.cshtml Razor 视图文件从 ASP.NET MVC 项目添加到 ASP.NET Core 项目。
运行 ASP.NET Core 应用和测试每个方法。 尚未迁移布局文件或样式, 因此呈现的视图仅包含视图文件中的内容。 你没有
About
和Contact
视图的布局文件生成链接, 因此你必须从浏览器调用它们 (将4492替换为项目中使用的端口号)。http://localhost:4492/home/about
http://localhost:4492/home/contact
请注意缺少样式和菜单项。 此问题将在下一部分得以解决。
静态内容
在以前版本的 ASP.NET MVC 中, 静态内容是从 web 项目的根托管的, 与服务器端文件混合。 在 ASP.NET Core 静态内容承载于wwwroot文件夹。 你将想要复制的静态内容从旧 ASP.NET MVC 应用程序到wwwroot ASP.NET Core 项目文件夹中的。 在此示例转换中:
- 复制favicon.ico文件从旧的 MVC 项目到wwwroot ASP.NET Core 项目文件夹中的。
旧的 ASP.NET MVC 项目使用启动来设置其样式, 并将启动文件存储在 "内容" 和 "脚本" 文件夹中。 生成旧的 ASP.NET MVC 项目的模板引用布局文件中的启动 (Views/Shared/_Layout)。 可以将 ASP.NET MVC 项目中的node.js和启动 .css文件复制到新项目中的wwwroot文件夹。 相反, 我们将在下一节中使用 Cdn 添加对启动 (和其他客户端库) 的支持。
迁移布局文件
复制 _ViewStart.cshtml文件从旧的 ASP.NET MVC 项目视图文件夹导入到 ASP.NET Core项目视图文件夹。 _ViewStart.cshtml文件未更改 ASP.NET Core mvc。
创建视图/共享文件夹。
可有可无将FullAspNetCore MVC 项目的views文件夹中的 _ViewImports复制到 ASP.NET Core 项目的views文件夹中。 删除 _ViewImports文件中的任何命名空间声明。 _ViewImports文件提供了所有视图文件的命名空间, 并引入了标记帮助程序。 标记帮助程序在新的布局文件中使用。 _ViewImports.cshtml文件是用于 ASP.NET Core 新功能。
复制 _Layout.cshtml文件从旧的 ASP.NET MVC 项目视图/共享文件夹导入到 ASP.NET Core 项目视图/共享文件夹。
打开 _Layout文件并进行以下更改 (完成的代码如下所示):
替换
@Styles.Render("~/Content/css")
为加载启动 .css的元素(见下文)。<link>
删除
@Scripts.Render("~/bundles/modernizr")
。注释掉
@Html.Partial("_LoginPartial")
行 (将@*...*@
该行环绕)。 有关详细信息, 请参阅将身份验证和标识迁移到 ASP.NET Core@Scripts.Render("~/bundles/jquery")
替换<script>
为元素 (见下文)。@Scripts.Render("~/bundles/bootstrap")
替换<script>
为元素 (见下文)。
用于启动 CSS 的替换标记包含:
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
JQuery 和启动 JavaScript 的替换标记包含:
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
更新后的 _Layout文件如下所示:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title - My ASP.NET Application</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" }) </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li>@Html.ActionLink("Home", "Index", "Home")</li> <li>@Html.ActionLink("About", "About", "Home")</li> <li>@Html.ActionLink("Contact", "Contact", "Home")</li> </ul> @*@Html.Partial("_LoginPartial")*@ </div> </div> </div> <div class="container body-content"> @RenderBody() <hr /> <footer> <p>© @DateTime.Now.Year - My ASP.NET Application</p> </footer> </div> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> @RenderSection("scripts", required: false) </body> </html>
在浏览器中查看站点。 它现在应正确加载, 并具有所需的样式。
- 可有可无你可能想要尝试使用新的布局文件。 对于此项目, 您可以从FullAspNetCore项目复制布局文件。 新的布局文件使用标记帮助程序, 并具有其他改进功能。
配置捆绑和缩减
有关如何配置绑定和缩减的信息, 请参阅捆绑和缩减。
解决 HTTP 500 错误
有许多问题可能会导致 HTTP 500 错误消息, 其中不包含问题根源的相关信息。 例如, 如果Views/_ViewImports文件包含项目中不存在的命名空间, 则会收到 HTTP 500 错误。 默认情况下,在 ASP.NET Core 应用中,UseDeveloperExceptionPage
扩展添加到IApplicationBuilder
和执行在配置后开发。 下面的代码对此进行了详细说明:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; namespace WebApp1 { public class Startup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } }
ASP.NET Core 将在 web 应用程序中未经处理的异常转换为 HTTP 500 错误响应。 通常, 这些响应中不包含错误详细信息, 以防止泄露有关服务器的可能敏感信息。 有关详细信息, 请参阅 "处理错误 " 中的使用开发者异常页。