Миграция с ASP.NET MVC на ASP.NET Core MVC

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

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

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

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

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

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

Настройка сайта 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 Основные приложения должны выбирать возможности платформы с ПО промежуточного слоя. Предыдущий код, созданный шаблоном, добавляет следующие службы и ПО промежуточного слоя:

  • Метод 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 будет добавлен новый пустой класс контроллера и класс представления для использования в качестве заполнителей с теми же именами, что и классы контроллера и представления в любом проекте MVC ASP.NET для миграции.

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

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

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

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

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

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

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

  1. В проекте ASP.NET Core щелкните правой кнопкой мыши каталог Views/Shared и выберите "Добавить>существующий элемент".
  2. В диалоговом окне "Добавление существующего элемента" перейдите в каталог представлений и общих представлений проекта MVC WebApp1 ASP.NET.
  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">

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

  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. По умолчанию в приложениях UseDeveloperExceptionPage ASP.NET Core расширение добавляется в 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 New Project dialog

New Web Application dialog: MVC project template selected in ASP.NET templates panel

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

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

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

New Project dialog

New ASP.NET Web Application dialog: Empty project template selected in ASP.NET Core Templates panel

  • Дополнительные: Создайте новое приложение 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 .

Add New Item dialog with MVC Controller Class selected

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

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

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

Add New Item dialog with MVC View Page selected

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

Solution Explorer showing files and directories of WebApp1

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

<h1>Hello world!</h1>

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

Web app open in 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проекта ASP.NET MVC и Index.cshtmlRazor просмотрите их в проект ASP.NET Core.

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

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

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

Contact page

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

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

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

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

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

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

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

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

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

  • _Layout.cshtml Скопируйте файл из ASP.NET представления или общий каталог проекта MVC в каталог представлений и общих представлений проекта 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 и Начальной загрузки 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 конфигурацию и выполняется при разработке. См. пример в следующем коде:

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

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

В этой статье показано, как начать миграцию проекта MVC ASP.NET в 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 New Project dialog

New Web Application dialog: MVC project template selected in ASP.NET templates panel

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

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

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

New Project dialog

New ASP.NET Web Application dialog: Empty project template selected in ASP.NET Core Templates panel

  • Дополнительные: Создайте новое приложение 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 .

Add New Item dialog with MVC Controller Class selected (prior to the release of ASP.NET Core 2.1)

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

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

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

Add New Item dialog with MVC View Page selected (prior to the release of ASP.NET Core 2.1)

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

Solution Explorer showing files and directories of WebApp1

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

<h1>Hello world!</h1>

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

Web app open in 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проекта ASP.NET MVC и Index.cshtmlRazor просмотрите их в проект ASP.NET Core.

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

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

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

Contact page

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

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

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

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

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

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

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

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

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

  • _Layout.cshtml Скопируйте файл из каталога представления или общего каталога проекта MVC ASP.NET в каталог представлений и общих представлений проекта 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">

Замена разметки для включения 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>

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

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

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

Дополнительные сведения о настройке объединение и минификации см. в разделе Bundling и Minification.

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

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