В прошлой теме был создан первый проект ASP.NET Core, который по умолчанию применяет паттерн MVC, но осталось за кадром, что именно заставляет паттерн MVC работать в проекте на ASP.NET Core.
Рассмотрим этот момент и чтобы лучше это понять, возьмем стандартный пустой проект ASP.NET, который по умолчанию никакой функциональности MVC в проект не подключает.
(Для этого можно либо в .NET CLI создадить проект с помощью команды dotnet new web
, либо в Visual Studio создадать новый проект по типу ASP.NET Core Empty)
Допустим, в моем случае проект называется MvcApp. По умолчанию создается примитивный проект ASP.NET Core, в котором файл Program.cs стандартный код:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/", () => "Hello World!"); app.Run();
Теперь задействуем функциональность фреймворка MVC в нашем приложении и изменим файл Program.cs следующим образом:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); // добавляем сервисы MVC var app = builder.Build(); // устанавливаем сопоставление маршрутов с контроллерами app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
Прежде всего надо отметить, что функциональность MVC, в частности, поддержка контроллеров и представлений, подключается в приложение в виде сервиса - в данном случае
с помощью вызова services.AddControllersWithViews()
. После этого мы можем использовать функциональность фреймворка MVC.
Кроме того, чтобы связать приходящие от пользователей запросы с контроллерами применяется метод MapControllerRoute()
.
Через перевый параметр - name в метод передается название маршрута - в данном случае "default". Через второй параметр - параметр pattern передается шаблон маршрута,
которому должен соответствовать запрос. В качестве шаблона маршрута применяется шаблон "{controller=Home}/{action=Index}/{id?}",
который представляет трехсегментный запрос. В нем первый сегмент представляет контроллер, второй сегмент - метод контроллера, а третий - необязательный параметр.
При этом если в запросе не указаны сегменты (например, обращение идет к корню веб-приложения), то в качестве контроллера по умолчанию применяется HomeController, а в качестве
его метода - метод Index.
Теперь добавим в проект для хранения контроллеров папку Controllers. И затем в нее добавим новый класс, который назовем HomeController и который будет иметь следующий код:
using Microsoft.AspNetCore.Mvc; namespace MvcApp.Controllers { public class HomeController : Controller { public IActionResult Index() { return View(); } } }
Контроллер наследуется от класса Controller и в данном случае он имеет один метод Index, который с помощью метода View обращается к представлению.
Теперь добавим в проект папку Views, которая будет хранить представления. В эту папку вначале добавим каталог Home - каталог, предназначенный непосредственно для представлений контроллера Home. И в конце добавим в каталог Views/Home новый элемент по типу Razor View (Empty), который назовем Index.cshtml.
Определим в этом файле следующий код:
@{ Layout = null; } <!doctype html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <h2>Hello METANIT.COM!</h2> </body> </html>
Это простейшее представление, которое будет использоваться методом Index контроллера HomeController. То есть в итоге у нас получится следующая структра проекта:
Теперь запустим приложение на выполнение, и браузер выведет сообщение, определенное в представлении Index.cshtml:
Таким образом мы можем добавлять функциональность MVC в свой проект. Однако, как правило, для работы с MVC используется шаблон ASP.NET Core Web App (Model-View-Controller), который по умолчанию содержит некоторую базовую функциональность.
Функциональность MVC и ее работа в приложении зависит от добавляемых сервисов. В примере выше мы использовали метод AddControllersWithViews()
для добавления сервисов MVC,
благодаря чему система маршрутизации смогла связать запрос с контроллером. Однако в данном случае у нас есть ряд опций по встраиванию сервисов,
которые мы можем при необходимости использовать:
AddMvc(): добавляет все сервисы фреймворка MVC (в том числе сервисы для работы с аутентификацией и авторизацией, валидацией и т.д.)
AddMvcCore(): добавляет только основные сервисы фреймворка MVC, а всю дополнительную функциональность, типа аутентификацией и авторизацией, валидацией и т.д., необходимо добавлять самостоятельно
AddControllersWithViews(): добавляет только те сервисы фреймворка MVC, которые позволяют использовать контроллеры и представления и связанную функциональность. При создании проекта по типу ASP.NET Core Web App (Model-View-Controller) используется именно этот метод
AddControllers(): позволяет использовать контроллеры, но без представлений.
И в зависимости от того, насколько широко нам надо использовать возможности фреймворка MVC, выбирается соответствующий метод. Например, в примере выше мы могли бы использовать
вместо вызова AddControllersWithViews()
метод AddMvc()
.