Маршрутизация в ASP.NET Core MVC. Области

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии