Обновление 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. Дополнительные сведения см. в разделе Обновление вспомогательных библиотек.
- Установите расширение Visual Studio Помощника по обновлению .NET .
- Откройте решение ASP.NET MVC или веб-API в Visual Studio.
- В Обозреватель решений щелкните правой кнопкой мыши проект для обновления и выберите Обновить. Выберите Параллельное добавочное обновление проекта, которое является единственным вариантом обновления.
- В качестве целевого объекта обновления выберите Новый проект.
- Назовите проект и выберите шаблон. Если переносимый проект является проектом API, выберите ASP.NET Core веб-API. Если это проект MVC или MVC и веб-API, выберите ASP.NET Core MVC.
- Щелкните Далее.
- Выберите версию целевой платформы и нажмите кнопку Далее. Дополнительные сведения см. в статье Политика поддержки .NET и .NET Core.
- Просмотрите сводку изменений и нажмите кнопку Готово.
- Шаг Сводка
<Framework Project>
теперь подключен к<Framework ProjectCore>
через прокси-сервер Yarp и круговая диаграмма, показывающая перенесенные конечные точки. Выберите Обновить контроллер , а затем выберите контроллер для обновления. - Выберите компонент для обновления, а затем щелкните Обновить выбор.
Добавочное обновление
Выполните действия, описанные в разделе Начало работы с добавочными 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.
Предварительные требования
Visual Studio 2019 16.4 или более поздней версии с рабочей нагрузкой ASP.NET и разработка веб-приложений
Создание начального ASP.NET проекта MVC
Создайте пример ASP.NET проекта MVC в Visual Studio для миграции:
- В меню Файл выберите пункт Создать>Проект.
- Выберите ASP.NET веб-приложение (платформа .NET Framework), а затем нажмите кнопку Далее.
- Присвойте проекту имя WebApp1, чтобы пространство имен соответствовало ASP.NET Core проекту, созданному на следующем шаге. Нажмите кнопку создания.
- Выберите MVC, а затем нажмите кнопку Создать.
Создание проекта ASP.NET Core
Создайте новое решение с новым проектом ASP.NET Core для миграции:
- Запустите второй экземпляр Visual Studio.
- В меню Файл выберите пункт Создать>Проект.
- Выберите пункт Веб-приложение ASP.NET Core и нажмите кнопку Далее.
- В диалоговом окне Настройка нового проекта назовите проект WebApp1.
- Задайте расположение в каталоге, отличном от каталога предыдущего проекта, чтобы использовать то же имя проекта. Использование одного и того же пространства имен упрощает копирование кода между двумя проектами. Нажмите кнопку создания.
- В диалоговом окне Создание веб-приложения 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 .
- Скопируйте методы из ASP.NET MVC
HomeController
, чтобы заменить новые методы ASP.NET CoreHomeController
. Нет необходимости изменять тип возвращаемого значения для методов действия. Тип возвращаемого значения метода действия контроллера ASP.NET встроенного шаблона MVC имеет значение ActionResult; в ASP.NET Core MVC методы действия возвращаютIActionResult
вместо него. ОбъектActionResult
реализует интерфейсIActionResult
. - В проекте ASP.NET Core щелкните правой кнопкой мыши каталог Views/Home, выберите Добавить>существующий элемент.
- В диалоговом окне Добавление существующего элемента перейдите в каталог Views/Home проекта ASP.NET MVC WebApp1.
About.cshtml
Выберите файлы просмотра ,Contact.cshtml
иIndex.cshtml
Razor нажмите кнопку Добавить, заменив существующие файлы.
Дополнительные сведения см. в разделах Обработка запросов с помощью контроллеров в ASP.NET Core MVC и Представления в ASP.NET Core MVC.
Тестирование каждого метода
Каждую конечную точку контроллера можно протестировать, однако макет и стили рассматриваются далее в документе.
- Запустите приложение ASP.NET Core.
- Вызовите отображаемые представления из браузера в работающем приложении ASP.NET Core, заменив текущий номер порта номером порта, используемым в проекте ASP.NET Core. Например,
https://localhost:44375/home/about
.
Перенос статического содержимого
В ASP.NET MVC 5 и более ранних версий статическое содержимое размещалось из корневого каталога веб-проекта и скрестилось с файлами на стороне сервера. В ASP.NET Core статические файлы хранятся в корневом веб-каталоге проекта. Каталог по умолчанию — {content root}/wwwroot, но его можно изменить. Подробные сведения см. в статье Статические файлы в ASP.NET Core.
Скопируйте статическое содержимое из проекта ASP.NET MVC WebApp1 в каталог wwwroot в проекте ASP.NET Core WebApp1:
- В проекте ASP.NET Core щелкните правой кнопкой мыши каталог wwwroot и выберите Добавить>существующий элемент.
- В диалоговом окне Добавление существующего элемента перейдите к проекту ASP.NET MVC WebApp1 .
- Выберите файл favicon.ico , а затем нажмите кнопку Добавить, заменив существующий файл.
Перенос файлов макета
Скопируйте файлы макета проекта MVC ASP.NET в проект ASP.NET Core:
- В проекте ASP.NET Core щелкните правой кнопкой мыши каталог Views и выберите Добавить>существующий элемент.
- В диалоговом окне Добавление существующего элемента перейдите в каталог Views проекта ASP.NET MVC WebApp1.
- Выберите файл,
_ViewStart.cshtml
а затем нажмите кнопку Добавить.
Скопируйте файлы общего макета проекта MVC ASP.NET в проект ASP.NET Core:
- В проекте ASP.NET Core щелкните правой кнопкой мыши каталог Views/Shared и выберите Добавить>существующий элемент.
- В диалоговом окне Добавление существующего элемента перейдите в каталог Views/Shared проекта ASP.NET MVC WebApp1.
_Layout.cshtml
Выберите файл, а затем нажмите кнопку Добавить, заменив существующий файл.
В проекте ASP.NET Core откройте _Layout.cshtml
файл . Внесите следующие изменения в соответствии с готовым кодом, показанным ниже.
Обновите включение CSS начальной загрузки в соответствии с приведенным ниже кодом:
- Замените
@Styles.Render("~/Content/css")
элементом<link>
для загрузкиbootstrap.css
(см. ниже). - Удалите
@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 в соответствии с приведенным ниже кодом:
- Замените
@Scripts.Render("~/bundles/jquery")
элементом<script>
(см. ниже). - Замените
@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>© @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 проекта, созданного на следующем шаге.
Дополнительные: Измените имя решения с 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
— это платформа 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.
Структура проекта показана ниже:
Замените содержимое Views/Home/Index.cshtml
файла следующей разметкой:
<h1>Hello world!</h1>
Запустите приложение.
Дополнительные сведения см. в разделе Контроллеры и представления.
Для следующей функциональности требуется миграция из примера ASP.NET проекта MVC в проект ASP.NET Core:
клиентское содержимое (CSS, шрифты и скрипты)
controllers
узел "Представления"
модели
Комплектации
filters
Вход в систему и выход из системы ( Identity это будет сделано в следующем руководстве.)
Контроллеры и представления
Скопируйте каждый из методов из ASP.NET MVC
HomeController
в новыйHomeController
. В ASP.NET MVC тип возвращаемого значения метода действия контроллера встроенного шаблона имеет значение ActionResult; в ASP.NET Core MVC вместо этого возвращаютсяIActionResult
методы действия.ActionResult
IActionResult
реализует , поэтому нет необходимости изменять тип возвращаемого значения методов действия.About.cshtml
Скопируйте файлы просмотра ,Contact.cshtml
иIndex.cshtml
Razor из проекта 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>© @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 проекта, созданного на следующем шаге.
Дополнительные: Измените имя решения с 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
— это платформа 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
в каталог Контроллеры .
Добавьте каталог Views .
Добавьте каталог Views/Home .
Добавьте представление сRazor именем
Index.cshtml
в каталог Views/Home.
Структура проекта показана ниже:
Замените содержимое Views/Home/Index.cshtml
файла следующей разметкой:
<h1>Hello world!</h1>
Запустите приложение.
Дополнительные сведения см. в разделе Контроллеры и представления.
Для следующей функциональности требуется миграция из примера ASP.NET проекта MVC в проект ASP.NET Core:
клиентское содержимое (CSS, шрифты и скрипты)
controllers
узел "Представления"
модели
Комплектации
filters
Вход в систему и выход из системы ( Identity это будет сделано в следующем руководстве.)
Контроллеры и представления
Скопируйте каждый из методов из ASP.NET MVC
HomeController
в новыйHomeController
. В ASP.NET MVC тип возвращаемого значения метода действия контроллера встроенного шаблона имеет значение ActionResult; в ASP.NET Core MVC вместо этого возвращаютсяIActionResult
методы действия.ActionResult
IActionResult
реализует , поэтому нет необходимости изменять тип возвращаемого значения методов действия.About.cshtml
Скопируйте файлы просмотра ,Contact.cshtml
иIndex.cshtml
Razor из проекта 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>© @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. Как правило, сведения об ошибках не включаются в эти ответы, чтобы предотвратить раскрытие потенциально конфиденциальной информации о сервере. Дополнительные сведения см. на странице исключений для разработчиков.