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




