Содержание
В приложениях ASP.NET Core MVC можно выделять области. Область в ASP.NET Core MVC — это отдельный сегмент приложения, используемый для выполнения определенного круга задач. Например, в приложении можно выделить следующие области: область администрирования системы, область с каталогов товаров, область личного кабинета пользователя и т.д. Разделение приложения на области позволяет выстроить более чёткую структуру проекта.К каждой из областей в приложении может применяться своя маршрутизация
Ручное создание области
Рассмотрим работу с областями на примере нового приложения ASP.NET Core MVC. Допустим, мы хотим создать в своем приложении отдельную область для администратора приложения.
Добавим в корень проекта новую папку, назовем её Areas
и внутри этой папки создадим папку Admin
:
В папке Admin
будут располагаться все необходимые для области файлы и папки. Например, мы можем создать внутри Admin
подпапки Controllers
и Views
:
Теперь создадим новый контроллер для области Admin
. Для примера, назовем его HomeController
и определим в нем следующие действия:
using Microsoft.AspNetCore.Mvc; namespace AspAreas2.Areas.Admin.Controllers { [Area("Admin")] public class HomeController : Controller { public IActionResult Index() { return View(); } } }
Здесь стоит обратить внимание на атрибут, который мы применили к классу контроллера:
[Area("Admin")]
Таким образом мы указываем, что этот контроллер принадлежит области с названием Admin
. Также добавим новое представление в папку Admin/Views/Home
<h1>Область администрирования</h1>
В итоге должна получиться следующая структура проекта:
Чтобы использовать новую область, необходимо внести изменение в систему маршрутизации для нашего приложения. Добавим в метод Main() новый маршрут:
app.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}" );
Ограничение exists
используется для того, чтобы маршрут сопоставлялся только с теми областями, которые определены в приложении. Таким образом, если в пути будет указано название области, то обработка маршрута пойдет по пути Admin -> HomeController -> Index(). Если же название области не будет указано, то обработка маршрута пойдет по стандартному пути HomeController -> Index(). Запустим приложение и проверим его работу:
Здесь стоит обратить внимание на то, что при входе в область Admin к странице не был применен макет.
Применение макета приложения для областей
Чтобы использовать макет для области, мы можем использовать, например, такой код в представлении:
@{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Администрирование"; } <h1>Область администрирования</h1>
Второй вариант — если вы хотите применить единый шаблон для всех областей — переместите файл _ViewStart.cshtml в корень проекта:
В итоге получим следующий вид области администрирования:
Использование MapAreaControllerRoute для указания маршрута
С помощью метода MapAreaControllerRoute()
можно указать маршрут для конкретной области. Например,
app.MapAreaControllerRoute( name: "admin_area", areaName: "admin", pattern: "admin/{controller=Home}/{action=Index}/{id?}");
в качестве второго параметра мы указали имя области. Особое внимание стоит обратить на шаблон маршрута — в нем содержится статический сегмент admin. Этот сегмент используется для того, чтобы доступ к области осуществлялся только при наличии этого сегмента в пути запроса:
Аналогичным образом мы можем указывать маршруты для разных областей.
Указание маршрута через атрибуты
При указании маршрута через атрибуты маршрутизации можно не использовать MapAreaControllerRoute()
. Уберем из метода вызов MapAreaControllerRoute()
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); /*app.MapAreaControllerRoute( name: "admin_area", areaName: "admin", pattern: "admin/{controller=Home}/{action=Index}/{id?}");*/ app.Run(); }
и добавим к методу Index()
контроллера Areas/Admin/Controllers/HomeController следующий атрибут:
[Area("Admin")] public class HomeController : Controller { [Route("{area}/{controller=Home}/{action=Index}")] public IActionResult Index() { return View(); } }
Теперь это действие будет выполняться на следующих маршрутах:
- /admin
- /admin/Home
- /admin/Home/Index
то же самое мы могли бы сделать, используя три атрибута:
[Route("{area}")] [Route("{area}/{controller}")] [Route("{area}/{controller}/{action}")] public IActionResult Index() { return View(); }
Добавление областей в Visual Studio
Для добавления новой области в Visual Studio можно воспользоваться специальным шаблоном. Для этого необходимо создать в проекте папку Areas, вызвать контекстное меню и в пункте «Добавить» выбрать «Область»:
Затем задать название области:
и дождаться выполнения операции:
Итого
Области в ASP.NET Core — это отдельные сегменты приложение, объединенные по какому-либо признаку. Все области располагаются в специальной папке проекта с названием Areas
. Для областей используются те же правила маршрутизации, что и для всего приложения. Для областей можно создавать свои макеты представлений или же использовать общий для всего приложения макет.