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

В этой статье показано, как обновить приложение MVC или веб-API ASP.NET Framework до ASP.NET Core MVC с помощью помощника по обновлению Visual Studio .NET и метода добавочного обновления.

Обновление с помощью помощника по обновлению .NET

Если в проекте платформа .NET Framework есть необходимые вспомогательные библиотеки, по возможности их следует обновить до .NET Standard 2.0. Дополнительные сведения см. в разделе Обновление вспомогательных библиотек.

  1. Установите расширение Visual Studio Помощника по обновлению .NET .
  2. Откройте решение ASP.NET MVC или веб-API в Visual Studio.
  3. В Обозреватель решений щелкните правой кнопкой мыши проект для обновления и выберите Обновить. Выберите Параллельное добавочное обновление проекта, которое является единственным вариантом обновления.
  4. В качестве целевого объекта обновления выберите Новый проект.
  5. Назовите проект и выберите шаблон. Если переносимый проект является проектом API, выберите ASP.NET Core веб-API. Если это проект MVC или MVC и веб-API, выберите ASP.NET Core MVC.
  6. Щелкните Далее.
  7. Выберите версию целевой платформы и нажмите кнопку Далее. Дополнительные сведения см. в статье Политика поддержки .NET и .NET Core.
  8. Просмотрите сводку изменений и нажмите кнопку Готово.
  9. Шаг Сводка<Framework Project> теперь подключен к <Framework ProjectCore> через прокси-сервер Yarp и круговая диаграмма, показывающая перенесенные конечные точки. Выберите Обновить контроллер , а затем выберите контроллер для обновления.
  10. Выберите компонент для обновления, а затем щелкните Обновить выбор.

Добавочное обновление

Выполните действия, описанные в разделе Начало работы с добавочными ASP.NET, чтобы ASP.NET Core миграцию, чтобы продолжить процесс обновления.

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

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

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

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

Предварительные требования

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

Создайте пример ASP.NET проекта MVC в 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 Core и нажмите кнопку Далее.
  4. В диалоговом окне Настройка нового проекта назовите проект WebApp1.
  5. Задайте расположение в каталоге, отличном от каталога предыдущего проекта, чтобы использовать то же имя проекта. Использование одного и того же пространства имен упрощает копирование кода между двумя проектами. Нажмите кнопку создания.
  6. В диалоговом окне Создание веб-приложения ASP.NET Core убедитесь в том, что выбраны платформы .NET Core и ASP.NET Core 3.1. Выберите шаблон проекта Веб-приложение (модель-представление-контроллер) и нажмите кнопку Создать.

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

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

<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 MVCHomeController, чтобы заменить новые методы ASP.NET CoreHomeController. Нет необходимости изменять тип возвращаемого значения для методов действия. Тип возвращаемого значения метода действия контроллера ASP.NET встроенного шаблона MVC имеет значение ActionResult; в ASP.NET Core MVC методы действия возвращают IActionResult вместо него. Объект ActionResult реализует интерфейс IActionResult.
  2. В проекте ASP.NET Core щелкните правой кнопкой мыши каталог Views/Home, выберите Добавить>существующий элемент.
  3. В диалоговом окне Добавление существующего элемента перейдите в каталог Views/Home проекта ASP.NET MVC WebApp1.
  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 WebApp1 в каталог 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. В диалоговом окне Добавление существующего элемента перейдите в каталог Views проекта ASP.NET MVC WebApp1.
  3. Выберите файл, _ViewStart.cshtml а затем нажмите кнопку Добавить.

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

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

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

Обновите включение CSS начальной загрузки в соответствии с приведенным ниже кодом:

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

Завершенная разметка замены для включения CSS начальной загрузки:

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

Обновите включение jQuery и Bootstrap JavaScript в соответствии с приведенным ниже кодом:

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

Завершенная замена разметки для включения jQuery и Bootstrap JavaScript:

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

Дальнейшие действия

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

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

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

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

Примечание

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

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

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

Диалоговое окно создания проекта Visual Studio

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

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

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

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

Диалоговое окно создания нового проекта

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

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

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

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

Microsoft.AspNetCore.Mvc— это платформа MVC ASP.NET Core. 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 расширения добавляет обработчик статических файлов. Дополнительные сведения см. в статье Запуск и маршрутизация приложений.

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

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

  • Добавьте каталог Контроллеры .

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

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

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

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

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

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

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

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

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

<h1>Hello world!</h1>

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

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

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

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

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

  • controllers

  • узел "Представления"

  • модели

  • Комплектации

  • filters

  • Вход в систему и выход из системы ( Identity это будет сделано в следующем руководстве.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Закомментируйте @Html.Partial("_LoginPartial") строку (заключите строку ).@*...*@ Дополнительные сведения см. в статье Перенос проверки подлинности и Identity в 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.css"
    integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">

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

<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>

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

  • Дополнительные: Попробуйте использовать новый файл макета. Скопируйте файл макета из проекта FullAspNetCore . В новом файле макета используются вспомогательные функции тегов и есть другие улучшения.

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

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

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

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

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 кода см. в разделах Перенос конфигурации в ASP.NET Core и Миграция проверки подлинности и Identity в ASP.NET Core.

Примечание

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

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

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

Диалоговое окно создания проекта Visual Studio

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

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

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

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

Диалоговое окно создания нового проекта

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

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

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

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

Microsoft.AspNetCore.Mvc— это платформа MVC ASP.NET Core. 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 расширения добавляет маршрутизацию. Дополнительные сведения см. в статье Запуск и маршрутизация приложений.

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

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

  • Добавьте каталог Контроллеры .

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

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

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

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

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

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

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

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

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

<h1>Hello world!</h1>

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

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

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

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

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

  • controllers

  • узел "Представления"

  • модели

  • Комплектации

  • filters

  • Вход в систему и выход из системы ( Identity это будет сделано в следующем руководстве.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Закомментируйте @Html.Partial("_LoginPartial") строку (заключите строку ).@*...*@ Дополнительные сведения см. в статье Перенос проверки подлинности и Identity в 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.css"
    integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">

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

<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>

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

  • Дополнительные: Попробуйте использовать новый файл макета. Скопируйте файл макета из проекта FullAspNetCore . В новом файле макета используются вспомогательные функции тегов и есть другие улучшения.

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

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

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

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

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

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