从 ASP.NET MVC 迁移是一个多步骤过程。 本文介绍:
- 初始设置。
- 基本控制器和视图。
- 静态内容。
- 客户端依赖关系。
若要迁移配置和 Identity 代码,请参阅将配置迁移到 ASP.NET Core并迁移身份验证和 Identity ASP.NET Core。
先决条件
- 具有“ASP.NET 和 Web 开发”工作负载的 Visual Studio 2019 16.4 或更高版本
- .NET Core 3.1 SDK
创建初学者 ASP.NET MVC 项目
在 Visual Studio 中创建 ASP.NET MVC 项目的示例以进行迁移:
- 从“文件”菜单中选择“新建”>“项目” 。
- 选择 " ASP.NET Web 应用程序 (" .NET Framework ") ,然后选择"下一步"。
- 将项目命名为 WebApp1 ,使命名空间与下一步中创建的 ASP.NET Core 项目相匹配。 选择“创建” 。
- 选择 " MVC",然后选择 " 创建"。
创建 ASP.NET Core 项目
使用要迁移到的新 ASP.NET Core 项目创建新的解决方案:
- 启动 Visual Studio 的第二个实例。
- 从“文件”菜单中选择“新建”>“项目” 。
- 选择“ASP.NET Core Web 应用程序”,然后选择“下一步” 。
- 在 " 配置新项目 " 对话框中,将项目命名为 " WebApp1"。
- 将位置设置为与上一个项目不同的目录,以使用相同的项目名称。 使用同一个命名空间可以更轻松地在两个项目之间复制代码。 选择“创建” 。
- 在“创建新的 ASP.NET Core Web 应用程序”对话框中,确认选择“.NET Core”和“ASP.NET Core 3.1” 。 选择 " Web 应用程序 (模型-视图-控制器) " 项目模板,然后选择 " 创建"。
将 ASP.NET Core 网站配置为使用 MVC
在 ASP.NET Core 3.0 及更高版本的项目中,.NET Framework 不再是受支持的目标框架。 你的项目必须面向 .NET Core。 包含 MVC 的 ASP.NET Core 共享框架是 .net Core 运行时安装的一部分。 使用项目文件中的 Microsoft.NET.Sdk.Web SDK 时,会自动引用共享框架:
XML
<Project Sdk="Microsoft.NET.Sdk.Web">
有关详细信息,请参阅 框架引用。
在 ASP.NET Core 中, Startup 类:
- 替换 global.asax。
- 处理所有应用启动任务。
有关详细信息,请参阅 ASP.NET Core 中的应用启动。
在 "ASP.NET Core" 项目中,打开 "启动 .cs " 文件:
C#
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
ASP.NET Core 应用必须选择包含中间件的框架功能。 上一个模板生成的代码添加以下服务和中间件:
- AddControllersWithViews扩展方法为控制器、API 相关的功能和视图注册 MVC 服务支持。 有关 MVC 服务注册选项的详细信息,请参阅 mvc 服务注册
- UseStaticFiles扩展方法添加静态文件处理程序 Microsoft.AspNetCore.StaticFiles 。 UseStaticFiles必须先调用扩展方法 UseRouting 。 有关详细信息,请参阅 ASP.NET Core 中的静态文件。
- UseRouting扩展方法将添加路由。 有关详细信息,请参阅 ASP.NET Core 中的路由。
此现有配置包括将示例 ASP.NET MVC 项目迁移所需的内容。 有关 ASP.NET Core 中间件选项的详细信息,请参阅 ASP.NET Core 中的应用启动 。
迁移控制器和视图
在 ASP.NET Core 项目中,将添加新的空控制器类和视图类作为占位符使用与要从中进行迁移的任何 ASP.NET MVC 项目中的控制器和视图类相同的名称。
ASP.NET Core WebApp1 项目已包含与 ASP.NET MVC 项目相同的名称的最小示例控制器和视图。 这将用作 ASP.NET mvc 控制器的占位符,以及要从 ASP.NET mvc WebApp1 项目迁移的视图。
- 复制 ASP.NET MVC 中的方法 HomeController 以替换新的 ASP.NET Core HomeController 方法。 无需更改操作方法的返回类型。 ASP.NET mvc 内置模板的控制器操作方法返回类型为 ActionResult ; 在 ASP.NET Core MVC 中,操作方法将改为返回 IActionResult 。 ActionResult 可实现 IActionResult。
- 在 ASP.NET Core 项目中,右键单击 "视图"/ Home "目录",然后选择 "添加 > 现有项"。
- 在 "添加现有项" 对话框中,导航到 ASP.NET MVC WebApp1 项目的 "视图" 或 Home "目录"。
- 选择 "关于 ",然后依次选择 " Razor 添加"、"替换现有文件"。
有关详细信息,请参阅 在 ASP.NET Core MVC 中使用控制器处理请求 和 ASP.NET Core MVC 中的视图。
测试每个方法
可以测试每个控制器终结点,但在本文档的后面部分介绍了布局和样式。
- 运行 ASP.NET Core 应用。
- 通过将当前端口号替换为 ASP.NET Core 项目中使用的端口号,在运行 ASP.NET Core 应用程序的浏览器中调用呈现的视图。 例如,https://localhost:44375/home/about。
迁移静态内容
在 ASP.NET MVC 5 及更早版本中,静态内容是从 web 项目的根目录承载的,与服务器端文件混合。 在 ASP.NET Core 中,静态文件存储在项目的web 根目录中。 默认目录为 {content root}/wwwroot,但可以对其进行更改。 有关详细信息,请参阅 ASP.NET Core 中的静态文件。
将 ASP.NET MVC WebApp1 项目中的静态内容复制到 ASP.NET Core WebApp1 项目中的 wwwroot 目录:
- 在 ASP.NET Core 项目中,右键单击 wwwroot 目录,选择 "添加 > 现有项"。
- 在 "添加现有项" 对话框中,导航到 ASP.NET MVC WebApp1 项目。
- 选择 favicon 文件,然后选择 " 添加",替换现有文件。
迁移布局文件
将 ASP.NET MVC 项目布局文件复制到 ASP.NET Core 项目:
- 在 ASP.NET Core 项目中,右键单击 "视图" 目录,选择 "添加 > 现有项"。
- 在 "添加现有项" 对话框中,导航到 ASP.NET MVC WebApp1 项目的 "视图" 目录。
- 选择 _ViewStart 的文件,然后选择 " 添加"。
将 ASP.NET MVC 项目共享布局文件复制到 ASP.NET Core 项目:
- 在 ASP.NET Core 项目中,右键单击 "视图"/"共享" 目录,选择 "添加 > 现有项"。
- 在 "添加现有项" 对话框中,导航到 ASP.NET MVC WebApp1 项目的 视图/共享 目录。
- 选择 _Layout 的文件,然后选择 " 添加",替换现有文件。
在 ASP.NET Core 项目中,打开 _Layout。 进行以下更改,使其与下面显示的已完成代码相匹配:
更新启动 CSS 包含项以匹配以下已完成的代码:
- 替换为 @Styles.Render("~/Content/css") <link> 加载 启动 .css 的元素 (参阅下面的) 。
- 删除 @Scripts.Render("~/bundles/modernizr")。
已完成的启动 CSS 包含的替换标记:
HTML
<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 包含项以匹配以下已完成的代码:
- 替换 @Scripts.Render("~/bundles/jquery") 为 <script> 元素 (参见下面的) 。
- 替换 @Scripts.Render("~/bundles/bootstrap") 为 <script> 元素 (参见下面的) 。
JQuery 和启动 JavaScript 包含的已完成替换标记:
HTML
<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 cshtml 文件如下所示:
CSHTML
<!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>
</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>
在浏览器中查看站点。 它应采用所需的样式进行呈现。
配置捆绑和缩小
ASP.NET Core 与若干开源绑定和缩减解决方案(例如WebOptimizer和其他类似库)兼容。 ASP.NET Core 不提供本机捆绑和缩小解决方案。 有关配置绑定和缩减的信息,请参阅 捆绑和缩减。
解决 HTTP 500 错误
有许多问题可能会导致 HTTP 500 错误消息,其中不包含问题根源的相关信息。 例如,如果 Views/_ViewImports cshtml 文件包含项目中不存在的命名空间,则会生成 HTTP 500 错误。 默认情况下,在 ASP.NET Core 应用中, UseDeveloperExceptionPage 会将扩展添加到, IApplicationBuilder 并在 开发 环境时执行。 下面的代码对此进行了详细说明:
C#
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
ASP.NET Core 将未经处理的异常转换为 HTTP 500 错误响应。 通常,这些响应中不包含错误详细信息,以防止泄露有关服务器的可能敏感信息。 有关详细信息,请参阅 开发者异常页