Обновление с ASP.NET MVC и веб-API до ASP.NET Core MVC

В этой статье показано, как начать перенос проекта ASP.NET MVC в ASP.NET Core MVC. В процессе он выделяет связанные изменения из ASP.NET MVC.

Миграция с ASP.NET MVC — это многоэтапный процесс. В этой статье рассматриваются следующие вопросы:

  • Начальная настройка.
  • Основные контроллеры и представления.
  • Статическое содержимое.
  • Зависимости на стороне клиента.

Сведения о переносе конфигурации и кода см. в разделе Identity" и "Миграция аутентификации" и Identity в ASP.NET Core.

Prerequisites

Создание начального проекта ASP.NET MVC

Создайте пример проекта MVC ASP.NET в Visual Studio для миграции:

  1. В меню Файл выберите пункт Создать>Проект.
  2. Выберите ASP.NET веб-приложение (.NET Framework) и нажмите кнопку "Далее".
  3. Назовите проект WebApp1 , чтобы пространство имен соответствовало проекту ASP.NET Core, созданному на следующем шаге. Нажмите кнопку "Создать".
  4. Выберите MVC и нажмите кнопку "Создать".

Создание проекта ASP.NET Core

Создайте новое решение с новым проектом ASP.NET Core для миграции в:

  1. Запустите второй экземпляр Visual Studio.
  2. В меню Файл выберите пункт Создать>Проект.
  3. Выберите ASP.NET Основное веб-приложение и нажмите кнопку "Далее".
  4. В диалоговом окне "Настройка нового проекта " назовите проект WebApp1.
  5. Задайте расположение в папку, отличную от папки предыдущего проекта, чтобы использовать то же имя проекта. Использование одного пространства имен упрощает копирование кода между двумя проектами. Нажмите кнопку "Создать".
  6. В диалоговом окне Создание нового ASP.NET Core веб-приложения убедитесь, что выбраны .NET Core и ASP.NET Core 3.1. Выберите шаблон проекта веб-приложения (модельView-Controller) и нажмите кнопку "Создать".

Настройка сайта ASP.NET Core для использования MVC

В проектах ASP.NET Core 3.0 и более поздних версий платформа .NET Framework больше не является поддерживаемой целевой платформой. Проект должен быть предназначен для .NET Core. Общая платформа ASP.NET Core, которая включает MVC, является частью установки среды выполнения .NET Core. Общая платформа автоматически ссылается при использовании Microsoft.NET.Sdk.Web пакета SDK в файле проекта:

<Project Sdk="Microsoft.NET.Sdk.Web">

Дополнительные сведения см. в Справочнике по рамкам.

В ASP.NET Core Startup класс:

  • Global.asax заменяется.
  • Обрабатывает все задачи запуска приложения.

Дополнительные сведения см. в статье Запуск приложения в ASP.NET Core.

В проекте ASP.NET Core откройте Startup.cs файл:

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 расширения регистрирует поддержку службы MVC для контроллеров, функций, связанных с API, и представлений. Дополнительные сведения о параметрах регистрации службы 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.

  1. Скопируйте методы из ASP.NET MVC HomeController , чтобы заменить новые методы ASP.NET Core HomeController . Нет необходимости изменять тип возвращаемого значения методов действия. Возвращаемым типом метода действия контроллера встроенного шаблона ASP.NET MVC является ActionResult, тогда как в ASP.NET Core MVC методы действий возвращают IActionResult. ActionResult реализует IActionResult.
  2. В проекте ASP.NET Core щелкните правой кнопкой мыши каталог "Представления"Home и выберите "Добавить>существующий элемент".
  3. В диалоговом окне "Добавление существующего элемента" перейдите в директорию проекта ASP.NET MVC Home.
  4. Выберите файлы представления About.cshtml, Contact.cshtml, и Index.cshtmlRazor, затем выберите Добавить, заменяя существующие файлы.

Дополнительные сведения см. в разделе "Обработка запросов с помощью контроллеров" в ASP.NET Core MVC и представлениях в ASP.NET Core MVC.

Тестирование каждого метода

Каждая конечная точка контроллера может быть проверена, однако макет и стили рассматриваются далее в документе.

  1. Запустите приложение ASP.NET Core.
  2. Вызов отображаемых представлений из браузера в работающем приложении ASP.NET Core, заменив текущий номер порта номером порта, используемым в проекте ASP.NET Core. Например: https://localhost:44375/home/about.

Перенос статического содержимого

В ASP.NET MVC 5 или более ранней версии статическое содержимое размещено из корневого каталога веб-проекта и было перемешано с файлами на стороне сервера. В ASP.NET Core статические файлы хранятся в корневом каталоге проекта. Каталог по умолчанию {content root}/wwwroot, но его можно изменить. Подробные сведения см. в статье Статические файлы в ASP.NET Core.

Скопируйте статическое содержимое из проекта ASP.NET MVC wwwroot в каталог в проекте ASP.NET Core WebApp1:

  1. В проекте ASP.NET Core щелкните правой кнопкой мыши каталог, выберите wwwroot"Добавить>существующий элемент".
  2. В диалоговом окне "Добавление существующего элемента" перейдите к проекту ASP.NET MVC WebApp1 .
  3. favicon.ico Выберите файл, а затем нажмите кнопку "Добавить", заменив существующий файл.

Перенос файлов макета

Скопируйте файлы макета проекта MVC ASP.NET в проект ASP.NET Core:

  1. В проекте ASP.NET Core щелкните правой кнопкой мыши каталог, выберите Views"Добавить>существующий элемент".
  2. В диалоговом окне "Добавление существующего элемента" перейдите в каталог проекта MVC Views ASP.NET.
  3. _ViewStart.cshtml Выберите файл и нажмите кнопку "Добавить".

Скопируйте файлы общего макета проекта MVC ASP.NET в проект ASP.NET Core:

  1. В проекте ASP.NET Core щелкните правой кнопкой мыши каталог, выберите Views/Shared"Добавить>существующий элемент".
  2. В диалоговом окне "Добавление существующего элемента" перейдите в каталог проекта MVC Views/Shared ASP.NET.
  3. _Layout.cshtml Выберите файл, а затем нажмите кнопку "Добавить", заменив существующий файл.

В проекте ASP.NET Core откройте _Layout.cshtml файл. Внесите следующие изменения, чтобы соответствовать завершённому коду, показанному ниже:

Обновите включение Bootstrap CSS, чтобы оно соответствовало завершенному коду ниже:

  1. Замените @Styles.Render("~/Content/css") элементом <link> для загрузки bootstrap.css (см. ниже).
  2. Удалите @Scripts.Render("~/bundles/modernizr").

Завершенная разметка замены для подключения Bootstrap CSS:

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

Обновите подключение библиотек JavaScript jQuery и Bootstrap, чтобы соответствовать завершенному коду ниже.

  1. Замените @Scripts.Render("~/bundles/jquery") элементом <script> (см. ниже).
  2. Замените @Scripts.Render("~/bundles/bootstrap") элементом <script> (см. ниже).

Завершенная разметка для замены, предназначенная для добавления JavaScript jQuery и Bootstrap:

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

Обновленный _Layout.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.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>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.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 среду и выполняется при разработке среды. Это подробно описано в следующем коде:

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. Как правило, сведения об ошибке не включаются в эти ответы, чтобы предотвратить раскрытие потенциально конфиденциальной информации о сервере. Дополнительные сведения см. на странице исключений разработчика.

Дальнейшие шаги

  • <identity.md>

Дополнительные ресурсы

В этой статье показано, как начать перенос проекта ASP.NET MVC в ASP.NET Core MVC 2.2. В этом процессе выделяется множество вещей, которые изменились с ASP.NET MVC. Миграция с ASP.NET MVC — это многоэтапный процесс. В этой статье рассматриваются следующие вопросы:

  • Начальная настройка
  • Базовые контроллеры и представления
  • Статическое содержимое
  • Зависимости на стороне клиента.

Сведения о переносе конфигурации и Identity кода см. в configuration.md <> и <identity.md>.

Note

Номера версий в примерах могут не быть текущими, обновите проекты соответствующим образом.

Создание начального проекта ASP.NET MVC

Чтобы продемонстрировать обновление, мы начнем с создания приложения ASP.NET MVC. Создайте его с именем WebApp1 , чтобы пространство имен соответствовало проекту ASP.NET Core, созданному на следующем шаге.

Диалоговое окно

Диалоговое окно создания веб-приложения: шаблон проекта MVC, выбранный на панели шаблонов ASP.NET

Необязательный: Измените имя решения с WebApp1 на Mvc5. Visual Studio отображает новое имя решения (Mvc5), что упрощает отличение этого проекта от следующего проекта.

Создание проекта ASP.NET Core

Создайте пустое веб-приложение ASP.NET Core с тем же именем, что и предыдущий проект (WebApp1), чтобы пространства имен в двух проектах совпадали. Наличие одного пространства имен упрощает копирование кода между двумя проектами. Создайте этот проект в каталоге, отличном от предыдущего проекта, чтобы использовать то же имя.

Диалоговое окно

Диалоговое окно

  • Необязательный: Создайте новое приложение ASP.NET Core с помощью шаблона проекта веб-приложения . Назовите проект WebApp1 и выберите параметр проверки подлинности отдельных учетных записей пользователей. Переименуйте это приложение в FullAspNetCore. Создание этого проекта экономит время в преобразовании. Конечный результат можно просмотреть в коде, созданном шаблоном, код можно скопировать в проект преобразования или сравнить с проектом, созданным шаблоном.

Настройка сайта для использования MVC

  • При выборе .NET Core по умолчанию ссылка на метапакет Microsoft.AspNetCore.App ссылается. Этот пакет содержит пакеты, часто используемые приложениями MVC. Если используется .NET Framework, ссылки на пакеты должны быть указаны отдельно в файле проекта.

Microsoft.AspNetCore.Mvc — это платформа ASP.NET Core MVC. Microsoft.AspNetCore.StaticFiles — это статический обработчик файлов. ASP.NET Core приложения явно выбирают использование промежуточного ПО, например для предоставления статических файлов. Дополнительные сведения см. в разделе "Статические файлы".

  • Откройте файл и измените Startup.cs код следующим образом:
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 расширения добавляет статический обработчик файлов. Дополнительные сведения см. в разделе "Запуск имаршрутизация приложений".

Добавьте контроллер и представление

В этом разделе добавляются минимальные контроллер и представление, чтобы служить заполнителями для контроллера и представлений MVC ASP.NET, которые будут перенесены в следующем разделе.

  • Добавьте каталог Controllers.

  • Добавьте класс контроллера с именем HomeController.cs в Controllers каталог.

Диалоговое окно добавления нового элемента с выбранным классом контроллера MVC

  • Добавьте каталог Views.

  • Добавьте каталог Views/Home.

  • Razor Добавьте представление с именем Index.cshtml в Views/Home каталог.

Диалоговое окно

Структура проекта показана ниже:

Обозреватель решений с файлами и каталогами WebApp1

Замените содержимое Views/Home/Index.cshtml файла следующим разметкой:

<h1>Hello world!</h1>

Запустите приложение.

Веб-приложение открыто в Microsoft Edge

Дополнительные сведения см. в разделе "Контроллеры и представления".

Для следующей функциональности требуется миграция из примера ASP.NET проекта MVC в проект ASP.NET Core:

  • клиентское содержимое (CSS, шрифты и скрипты)

  • controllers

  • views

  • models

  • bundling

  • filters

  • Войти/выйти Identity (это делается в следующем руководстве.)

Контроллеры и представления

  • Скопируйте все методы из ASP.NET MVC HomeController в новый HomeController. В ASP.NET MVC встроенный шаблон контроллера действий возвращает тип ActionResult; в ASP.NET Core MVC методы действий возвращают IActionResult. ActionResult IActionResult реализует, поэтому нет необходимости изменять тип возвращаемого значения методов действия.

  • Скопируйте файлы представлений About.cshtml, Contact.cshtml, и Index.cshtmlRazor из проекта ASP.NET MVC в проект ASP.NET Core.

Тестирование каждого метода

Файл макета и стили еще не перенесены, поэтому отображаемые представления содержат только содержимое в файлах представления. Файл макета, который создает ссылки для представлений About и Contact, пока не будет доступен.

Вызов отображаемых представлений из браузера в работающем ASP.NET базовом приложении, заменив текущий номер порта номером порта, используемым в основном проекте ASP.NET. Например: https://localhost:44375/home/about.

Страница контакта

Обратите внимание на отсутствие стилей и элементов меню. Стилизация будет исправлена в следующем разделе.

Статическое содержимое

В ASP.NET MVC 5 или более ранней версии статическое содержимое размещено из корневого каталога веб-проекта и было перемешано с файлами на стороне сервера. В ASP.NET Core статический контент размещается в каталоге wwwroot . Скопируйте статическое содержимое из приложения wwwroot ASP.NET MVC в каталог в проекте ASP.NET Core. В этом примере преобразования:

  • favicon.ico Скопируйте файл из проекта ASP.NET MVC в каталог в проекте wwwroot ASP.NET Core.

Проект ASP.NET MVC использует Bootstrap для его стилизации и сохраняет файлы Bootstrap в Content каталогах и Scripts каталогах. Шаблон, который создал проект ASP.NET MVC, ссылается на Bootstrap в файле макета страницы (Views/Shared/_Layout.cshtml). Файлы bootstrap.js и bootstrap.css можно скопировать из проекта ASP.NET MVC в каталог wwwroot в новом проекте. Вместо этого в этом документе добавлена поддержка для Bootstrap (и других клиентских библиотек) с помощью CDN в следующем разделе.

Перенос файла макета

  • Скопируйте файл _ViewStart.cshtml из каталога Views проекта MVC ASP.NET в каталог Views проекта ASP.NET Core. Файл _ViewStart.cshtml не изменился в ASP.NET Core MVC.

  • Создайте каталог Views/Shared.

  • Необязательный: Скопируйте _ViewImports.cshtml из каталога проекта MVC FullAspNetCore в каталог проекта Views ASP.NET Core Views . Удалите любое объявление пространства имен в _ViewImports.cshtml файле. Файл _ViewImports.cshtml предоставляет пространства имен для всех файлов представления и предоставляет вспомогательные функции тегов. Вспомогательные функции тегов используются в новом файле макета. Файл _ViewImports.cshtml является новым для ASP.NET Core.

  • Скопируйте файл _Layout.cshtml из каталога Views/Shared проекта MVC ASP.NET в каталог Views/Shared проекта ASP.NET Core.

Откройте _Layout.cshtml файл и внесите следующие изменения (полный код показан ниже):

  • Замените @Styles.Render("~/Content/css") элементом <link> для загрузки bootstrap.css (см. ниже).

  • Удалите @Scripts.Render("~/bundles/modernizr").

  • Закомментируйте строку @Html.Partial("_LoginPartial") (окружите строку тегами @*...*@). Дополнительные сведения см. в разделе «Миграция аутентификации на ASP.NET Core»Identity

  • Замените @Scripts.Render("~/bundles/jquery") элементом <script> (см. ниже).

  • Замените @Scripts.Render("~/bundles/bootstrap") элементом <script> (см. ниже).

Разметка замены для включения CSS Bootstrap:

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

Разметка замены для включения JavaScript для jQuery и Bootstrap:

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

Обновленный _Layout.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.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.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
            crossorigin="anonymous"></script>
    @RenderSection("scripts", required: false)
</body>
</html>

Просмотр сайта в браузере. Теперь она должна правильно загружаться с ожидаемыми стилями.

Настройка объединения и минификации

Сведения о настройке объединения и минификации см. в разделе Объединение и Минификация.

Устранение ошибок HTTP 500

Существует множество проблем, которые могут вызвать сообщения об ошибках HTTP 500, которые не содержат сведений о источнике проблемы. Например, если Views/_ViewImports.cshtml файл содержит пространство имен, которое не существует в проекте, создается ошибка HTTP 500. По умолчанию в приложениях ASP.NET Core расширение добавляется в UseDeveloperExceptionPage и выполняется в конфигурации IApplicationBuilder. См. пример в следующем коде:

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 преобразует необработанные исключения в ответы на ошибки HTTP 500. Как правило, сведения об ошибке не включаются в эти ответы, чтобы предотвратить раскрытие потенциально конфиденциальной информации о сервере. Дополнительные сведения см. на странице исключений разработчика.

Дополнительные ресурсы

В этой статье показано, как начать перенос проекта ASP.NET MVC в ASP.NET Core MVC 2.1. В этом процессе выделяется множество вещей, которые изменились с ASP.NET MVC. Миграция с ASP.NET MVC — это многоэтапный процесс. В этой статье рассматриваются следующие вопросы:

  • Начальная настройка
  • Базовые контроллеры и представления
  • Статическое содержимое
  • Зависимости на стороне клиента.

Сведения о переносе конфигурации и кода см. в разделе Identity" и "Миграция аутентификации" и Identity в ASP.NET Core.

Note

Номера версий в примерах могут не быть текущими, обновите проекты соответствующим образом.

Создание начального проекта ASP.NET MVC

Чтобы продемонстрировать обновление, мы начнем с создания приложения ASP.NET MVC. Создайте его с именем WebApp1 , чтобы пространство имен соответствовало проекту ASP.NET Core, созданному на следующем шаге.

Диалоговое окно

Диалоговое окно создания веб-приложения: шаблон проекта MVC, выбранный на панели шаблонов ASP.NET

Необязательный: Измените имя решения с WebApp1 на Mvc5. Visual Studio отображает новое имя решения (Mvc5), что упрощает отличение этого проекта от следующего проекта.

Создание проекта ASP.NET Core

Создайте пустое веб-приложение ASP.NET Core с тем же именем, что и предыдущий проект (WebApp1), чтобы пространства имен в двух проектах совпадали. Наличие одного пространства имен упрощает копирование кода между двумя проектами. Создайте этот проект в каталоге, отличном от предыдущего проекта, чтобы использовать то же имя.

Диалоговое окно

Диалоговое окно

  • Необязательный: Создайте новое приложение ASP.NET Core с помощью шаблона проекта веб-приложения . Назовите проект WebApp1 и выберите параметр проверки подлинности отдельных учетных записей пользователей. Переименуйте это приложение в FullAspNetCore. Создание этого проекта экономит время в преобразовании. Конечный результат можно просмотреть в коде, созданном шаблоном, код можно скопировать в проект преобразования или сравнить с проектом, созданным шаблоном.

Настройка сайта для использования MVC

  • При выборе .NET Core по умолчанию ссылка на метапакет Microsoft.AspNetCore.App ссылается. Этот пакет содержит пакеты, часто используемые приложениями MVC. Если используется .NET Framework, ссылки на пакеты должны быть указаны отдельно в файле проекта.

Microsoft.AspNetCore.Mvc — это платформа ASP.NET Core MVC. Microsoft.AspNetCore.StaticFiles — это статический обработчик файлов. ASP.NET Core приложения явно выбирают использование промежуточного ПО, например для предоставления статических файлов. Дополнительные сведения см. в разделе "Статические файлы".

  • Откройте файл и измените Startup.cs код следующим образом:
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 расширения добавляет статический обработчик файлов. Метод UseMvc расширения добавляет маршрутизацию. Дополнительные сведения см. в разделе "Запуск имаршрутизация приложений".

Добавьте контроллер и представление

В этом разделе добавляются минимальные контроллер и представление, чтобы служить заполнителями для контроллера и представлений MVC ASP.NET, которые будут перенесены в следующем разделе.

  • Добавьте каталог Controllers.

  • Добавьте класс контроллера с именем HomeController.cs в Controllers каталог.

Диалоговое окно добавления нового элемента с выбранным классом контроллера MVC (до выпуска ASP.NET Core 2.1)

  • Добавьте каталог Views.

  • Добавьте каталог Views/Home.

  • Razor Добавьте представление с именем Index.cshtml в Views/Home каталог.

Диалоговое окно

Структура проекта показана ниже:

Обозреватель решений с файлами и каталогами WebApp1

Замените содержимое Views/Home/Index.cshtml файла следующим разметкой:

<h1>Hello world!</h1>

Запустите приложение.

Веб-приложение открыто в Microsoft Edge

Дополнительные сведения см. в разделе "Контроллеры и представления".

Для следующей функциональности требуется миграция из примера ASP.NET проекта MVC в проект ASP.NET Core:

  • клиентское содержимое (CSS, шрифты и скрипты)

  • controllers

  • views

  • models

  • bundling

  • filters

  • Войти/выйти Identity (это делается в следующем руководстве.)

Контроллеры и представления

  • Скопируйте все методы из ASP.NET MVC HomeController в новый HomeController. В ASP.NET MVC встроенный шаблон контроллера действий возвращает тип ActionResult; в ASP.NET Core MVC методы действий возвращают IActionResult. ActionResult IActionResult реализует, поэтому нет необходимости изменять тип возвращаемого значения методов действия.

  • Скопируйте файлы представлений About.cshtml, Contact.cshtml, и Index.cshtmlRazor из проекта ASP.NET MVC в проект ASP.NET Core.

Тестирование каждого метода

Файл макета и стили еще не перенесены, поэтому отображаемые представления содержат только содержимое в файлах представления. Файл макета, который создает ссылки для представлений About и Contact, пока не будет доступен.

  • Вызов отображаемых представлений из браузера в работающем ASP.NET базовом приложении, заменив текущий номер порта номером порта, используемым в основном проекте ASP.NET. Например: https://localhost:44375/home/about.

Страница контакта

Обратите внимание на отсутствие стилей и элементов меню. Стилизация будет исправлена в следующем разделе.

Статическое содержимое

В ASP.NET MVC 5 или более ранней версии статическое содержимое размещено из корневого каталога веб-проекта и было перемешано с файлами на стороне сервера. В ASP.NET Core статический контент размещается в каталоге wwwroot . Скопируйте статическое содержимое из приложения wwwroot ASP.NET MVC в каталог в проекте ASP.NET Core. В этом примере преобразования:

  • favicon.ico Скопируйте файл из проекта ASP.NET MVC в каталог в проекте wwwroot ASP.NET Core.

Проект ASP.NET MVC использует Bootstrap для его стилизации и сохраняет файлы Bootstrap в Content каталогах и Scripts каталогах. Шаблон, который создал проект ASP.NET MVC, ссылается на Bootstrap в файле макета страницы (Views/Shared/_Layout.cshtml). Файлы bootstrap.js и bootstrap.css можно скопировать из проекта ASP.NET MVC в каталог wwwroot в новом проекте. Вместо этого в этом документе добавлена поддержка для Bootstrap (и других клиентских библиотек) с помощью CDN в следующем разделе.

Перенос файла макета

  • Скопируйте файл _ViewStart.cshtml из каталога Views проекта MVC ASP.NET в каталог Views проекта ASP.NET Core. Файл _ViewStart.cshtml не изменился в ASP.NET Core MVC.

  • Создайте каталог Views/Shared.

  • Необязательный: Скопируйте _ViewImports.cshtml из каталога проекта MVC FullAspNetCore в каталог проекта Views ASP.NET Core Views . Удалите любое объявление пространства имен в _ViewImports.cshtml файле. Файл _ViewImports.cshtml предоставляет пространства имен для всех файлов представления и предоставляет вспомогательные функции тегов. Вспомогательные функции тегов используются в новом файле макета. Файл _ViewImports.cshtml является новым для ASP.NET Core.

  • Скопируйте файл _Layout.cshtml из каталога Views/Shared проекта MVC ASP.NET в каталог Views/Shared проекта ASP.NET Core.

Откройте _Layout.cshtml файл и внесите следующие изменения (полный код показан ниже):

  • Замените @Styles.Render("~/Content/css") элементом <link> для загрузки bootstrap.css (см. ниже).

  • Удалите @Scripts.Render("~/bundles/modernizr").

  • Закомментируйте строку @Html.Partial("_LoginPartial") (окружите строку тегами @*...*@). Дополнительные сведения см. в разделе «Миграция аутентификации на ASP.NET Core»Identity

  • Замените @Scripts.Render("~/bundles/jquery") элементом <script> (см. ниже).

  • Замените @Scripts.Render("~/bundles/bootstrap") элементом <script> (см. ниже).

Разметка замены для включения CSS Bootstrap:

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

Разметка замены для включения JavaScript для jQuery и Bootstrap:

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

Обновленный _Layout.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.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.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
            crossorigin="anonymous"></script>
    @RenderSection("scripts", required: false)
</body>
</html>

Просмотр сайта в браузере. Теперь она должна правильно загружаться с ожидаемыми стилями.

Настройка объединения и минификации

Сведения о настройке объединения и минификации см. в разделе Объединение и Минификация.

Устранение ошибок HTTP 500

Существует множество проблем, которые могут вызвать сообщения об ошибках HTTP 500, которые не содержат сведений о источнике проблемы. Например, если Views/_ViewImports.cshtml файл содержит пространство имен, которое не существует в проекте, создается ошибка HTTP 500. По умолчанию в приложениях ASP.NET Core расширение добавляется в UseDeveloperExceptionPage и выполняется в конфигурации IApplicationBuilder. См. пример в следующем коде:

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 преобразует необработанные исключения в ответы на ошибки HTTP 500. Как правило, сведения об ошибке не включаются в эти ответы, чтобы предотвратить раскрытие потенциально конфиденциальной информации о сервере. Дополнительные сведения см. на странице исключений разработчика.

Дополнительные ресурсы