Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
В прошлой теме был создан первый проект ASP.NET Core MVC, но осталось за кадром, что именно заставляет паттерн MVC работать в проекте на ASP.NET Core? В чем ключевое отличие проекта по типу Empty, который функциональность MVC не содержит, от проекта по типу Web Application? Рассмотрим этот момент.
И в начале создадим новый проект ASP.NET Core по типу Empty - то есть тот, который mvc по умолчанию не использует:
Теперь задействуем функциональность фреймворка MVC в нашем приложении. MVC подключается в приложение в качестве сервиса. Поэтому откроем класс Startup и изменим его следующим образом:
using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; namespace EmptyApp { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(); // добавляем сервисы MVC } public void Configure(IApplicationBuilder app) { app.UseRouting(); // используем систему маршрутизации app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } } }
Во-первых, в методе ConfigureServices()
с помощью вызова services.AddMvc()
добавляются всее сервисы MVC.
После этого мы можем использовать фреймворк.
Во-вторых, в методе Configure()
через вызовы app.UseRouting()
и app.UseEndpoints()
встраивается система маршрутизации,
которая позволяет связать приходящие от пользователей запросы с контроллерами. В общих чертах система маршрутизации уже рассматривалась в одной из предыдущих
тем (Основы маршрутизации в ASP.NET Core). В данном же случае стоит отметить,
что мы используем метод MapControllerRoute()
интерфейса IEndpointRouteBuilder для связи контроллеров с маршрутом "{controller=Home}/{action=Index}/{id?}",
то есть трехсегментным запросом, где первый сегмент представляет контроллер, второй сегмент - метод контроллера, а третий - необязательный параметр.
При этом если в запросе не указаны сегменты (например, обращение идет к корню веб-приложения), то в качестве контроллера применяется HomeController, а в качестве
его метода - метод Index.
Теперь добавим в проект для хранения контроллеров папку Controllers. И затем в нее добавим новый класс, который назовем HomeController и который будет иметь следующий код:
using Microsoft.AspNetCore.Mvc; namespace EmptyApp.Controllers { public class HomeController : Controller { public IActionResult Index() { return View(); } } }
Контроллер должен быть унаследован от класса Controller и в данном случае он имеет один метод Index, который с помощью метода View обращается к представлению.
Теперь добавим в проект папку Views, которая будет хранить представления. В эту папку вначале добавим каталог Home - каталог, предназначенный непосредственно для представлений контроллера Home. И в конце добавим в каталог Views/Home новый элемент по типу Razor View, который назовем Index.cshtml.
Определим в этом файле следующий код:
@{ Layout = null; } <!doctype html> <html> <head> <title>Hello ASP.NET MVC Core</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width"> </head> <body> <h2>Привет мир!</h2> </body> </html>
Это простейшее представление, которое будет использоваться методом Index контроллера HomeController. То есть в итоге у нас получится следующая структра проекта:
Теперь запустим приложение на выполнение, и браузер выведет сообщение, определенное в представлении:
Таким образом мы можем добавлять функциональность MVC в свой проект. Однако, как правило, для работы с MVC используется шаблон ASP.NET Core Web App (Model-View-Controller), который по умолчанию содержит некоторую базовую функциональность.
Функциональность MVC и ее работа в приложении зависит от добавляемых сервисов. В примере выше мы использовали метод AddMvc()
для добавления сервисов MVC,
благодаря чему система маршрутизации смогла связать запрос с контроллером. Однако в данном случае у нас есть ряд опций по встраиванию сервисов,
которые мы можем при необходимости использовать:
AddMvc(): добавляет все сервисы фреймворка MVC (в том числе сервисы для работы с аутентификацией и авторизацией, валидацией и т.д.)
AddMvcCore(): добавляет только основные сервисы фреймворка MVC, а всю допалнительную функциональность, типа аутентификацией и авторизацией, валидацией и т.д., необходимо добавлять самостоятельно
AddControllersWithViews(): добавляет только те сервисы фреймворка MVC, которые позволяют использовать контроллеры и представления и связанную функциональность. При создании проекта по типу ASP.NET Core Web App (Model-View-Controller) используется именно этот метод
AddControllers(): позволяет использовать контроллеры, но без представлений.
И в зависимости от того, насколько широко нам надо использовать возможности фреймворка MVC, выбирается соответствующий метод. Например, в примере выше мы могли бы использовать
вместо вызова services.AddMvc()
метод services.AddControllersWithViews()
.