将从 ASP.NET MVC 迁移到 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 项目

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

Visual Studio "新建项目" 对话框

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

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

创建 ASP.NET Core 项目

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

“新建项目”对话框

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

  • 可有可无使用 " 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文件夹。

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

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

“添加新项”对话框

项目结构如下所示:

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

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

<h1>Hello world!</h1>

运行应用。

在 Microsoft Edge 中打开的 Web 应用

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

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

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

  • 控制器

  • 视图

  • 模型

  • 销售

  • 筛选器

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

控制器和视图

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

  • 复制About.cshtmlContact.cshtml,和Index.cshtml Razor 视图文件从 ASP.NET MVC 项目添加到 ASP.NET Core 项目。

  • 运行 ASP.NET Core 应用和测试每个方法。 尚未迁移布局文件或样式, 因此呈现的视图仅包含视图文件中的内容。 你没有AboutContact视图的布局文件生成链接, 因此你必须从浏览器调用它们 (将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>&copy; @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 错误响应。 通常, 这些响应中不包含错误详细信息, 以防止泄露有关服务器的可能敏感信息。 有关详细信息, 请参阅 "处理错误 " 中的使用开发者异常页

其他资源

上一篇:从 ASP.NET 迁移到 ASP.NET Core

下一篇:将从 ASP.NET Web API 迁移到 ASP.NET Core

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程