Содержание
В предыдущей части мы в общих чертах познакомились с тем, что из себя представляет MVC. В этой — посмотрим как реализуется MVC в ASP.NET Core. Для этого мы создадим своё первое приложение ASP.NET Core MVC и посмотрим на то, какие в этом приложении принципиальные отличия от тех приложений, которые мы создавали, когда разбирались с базовой моделью ASP.NET Core.
Первое приложение ASP.NET Core MVC
Для того, чтобы создать своё первое приложение ASP.NET Core MVC выберем в Visual Studio следующий шаблон проекта:
По этому шаблону мы создадим приложение в котором уже будут содержаться все сервисы и компоненты middleware, необходимые для включения в проекте функциональности MVC.
На втором шаге необходимо задать название проекта
и, на третьем — указать дополнительные параметры, которые мы оставим со значениями по умолчанию
После этого мы увидим наше приложение в обозревателе решений, которое сразу же можем запустить. По умолчанию оно будет выглядеть следующим образом:
Вначале, посмотрим на структуру проекта.
Структура проекта ASP.NET Core MVC
- Connected Services — подключенные сервисы из Azure. Для пустого приложения этот узел ничего не содержит.
- Зависимости (Dependencies) — содержит все добавленные в проект пакеты и библиотеки. Пустой проект ASP.NET Core MVC содержит только базовые возможности ASP.NET Core и базовые возможности самой платформы .NET. То есть в этой папке проекта в разделе «Платформы» вы найдете всего два элемента:
- папка wwwroot — содержит статические файлы приложения, такие как скрипты, css-файлы и т.д. По умолчанию в этой папке уже расположено достаточно много чего — jquery, bootstrap, иконка приложения и т.д.
- папка Controllers — предназначена для размещения в ней всех контроллеров вашего приложения. По умолчанию в этой папке находится всего один файл — домашний контроллер (HomeController.cs)
- папка Models — содержит все модели вашего приложения. В частности, в этой папке можно найти модель для предоставлению ошибки, которая может возникнуть в приложении
- папка Views — содержит представления, используемые в приложении. Здесь по умолчанию также содержится ряд файлов, часть из которых расположены во вложенных папках. В частности в подпапке Home содержатся представления, которые используются при обращении к котроллеру
HomeController
. В папке Shared обычно сохраняются фалы (представления) используемые всем приложением, например, представления, отвечающие за макет приложения. - Properties — содержит настройки проекта. В частности, в файле launchSettings.json описаны настройки запуска проекта.
- appsettings.json — файл конфигурации проекта в формате json
- Program.cs — главный файл приложения, в котором расположен метод
Main
, с которого и начинается выполнение приложения. Код этого файла настраивает и запускает веб-приложение.
Часть из элементов структуры проекта ASP.NET Core MVC нам уже известна по работе с базовой моделью ASP.NET Core, часть — новые для нас файлы и папки, например, папки Controllers/Models/Views. Теперь посмотрим на код проекта, а именно — на метод Main
, который содержится в классе Program
.
Метод Main в ASP.NET Core MVC
Вот как выглядит код метода Main
для пустого шаблона ASP.NET Core MVC
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { 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.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run(); } }
По основным моментам, касающихся создания приложения ASP.NET Core можно изучить вот эту статью. Мы же остановимся здесь только на принципиальных отличиях проекта ASP.NET Core MVC от приложения, созданного по базовой модели. А принципиальные отличия следующие:
в проект подключаются сервисы функциональности MVC:
builder.Services.AddControllersWithViews();
По сути, этот метод расширения регистрирует сразу ряд сервисов, которые могут нам потребоваться в дальнейшем в работе. О том, что это за сервисы и как они влияют на функциональность нашего приложения мы поговорим позднее.
Далее, мы видим подключение в проект различных компонентов middleware, с которыми мы уже знакомились, а именно:
- компонент перенаправления пользователя на страницу с описанием ошибки (
app.UseExceptionHandler("/Home/Error")
) - компонент для работы со статическими файлами (
app.UseStaticFiles()
) - компонент для работы с маршрутизацией (
app.UseRouting()
) - компонент для авторизации пользователей (
app.UseAuthorization()
)
и, наконец, следующее принципиальное отличие от чистого ASP.NET Core — сопоставление шаблона маршрута с контроллером:
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
Метод MapControllerRoute
является методом расширения для IEndpointRouteBuilder
и содержит следующие параметры:
name
— название маршрута (по умолчанию, это имя default)pattern
— шаблон, которому должен соответствовать запрос пользователя.
в нашем случае, шаблон представляет собой путь, состоящий из трех сегментов {controller=Home}/{action=Index}/{id?}
где каждый сегмент — это параметр маршрута.
- Первый параметр
{controller=Home}
— имя контроллера (по умолчанию — этоHome
). Здесь стоит ещё раз обратить внимание на то, что в нашем приложении имеется контроллер класс которого называется HomeController. - Второй параметр
{action=Index}
указывает на действие (метод) в контроллере, которое должно выполняться. По умолчанию, этот параметр будет равенIndex
. - Третий параметр
{id?}
— необязательный параметр, который может отсутствовать в запросе.
Таким образом, при запуске приложения, так как путь запроса будет пустым, то мы попадем, фактически на следующий маршрут [host]/Home/Index
. Для сопоставления контроллеров и их методов с запросами в ASP.NET Core действует ряд соглашений по умолчанию и о них мы ещё поговорим. Пока же на этом закончим.
Итого
Для включения функциональности MVC в приложение ASP.NET Core вызывается либо метод AddControllersWithViews()
, который добавляет в проект сразу ряд сервисов, связанных с MVC (и не только, например, в этом же методе добавляется сервис аутентификации), либо, мы можем подключать только интересующие нас сервисы, связанные с MVC, используя отдельные методы расширения, например, AddMvcCore()
, AddControllers()
и т.д. Для сопоставления запроса и конечной точки в приложении ASP.NET Core MVC используется метод MapControllerRoute
, который сопоставляет шаблон маршрута с контроллером и его методом.