Содержание
Маршрутизация в ASP.NET Core — это процесс сопоставление запроса с конкретным адресом внутри приложения. Система маршрутизации в приложениях Blazor начинается с указания базового пути приложения и компонента Router, расположенного, в свою очередь, в главном компонента приложения — App.
Базовый путь приложения
Базовый путь приложения Blazor — это URL по которому располагается приложение. Например, по умолчанию, кода мы создаем новое приложение Blazor, его базовый путь будет «/», то есть:
- Физически наше приложение располагается, например, в папке
C:\BlazorApp\ - Запросы для нашего приложения принимаются, например, по URL «
https://localhost:7167/{путь_к_ресурсу}« - Когда мы указываем базовый путь приложения как
"/", то это означает, что при указании, например, в компоненте директивы@page "/age"система маршрутизации ASP.NET Core Blazor будет использовать этот относительный путь и предоставлять пользователю данные по следующему URL:https://localhost:7167/age.
Для приложений Blazor Server ASP.NET 6 базовый путь указывается в файле _layout.cshtml с использованием тега base:
@using Microsoft.AspNetCore.Components.Web
@namespace WebClient.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<!DOCTYPE html>
<html lang="ru">
<head>
.....
<base href="~/" />
.....
</head>
<body>
@RenderBody()
.....
</body>
</html>
Второй вариант указания базового пути — это указать его в файле Program.cs, например,
app.UsePathBase("/BlazorApp");
Шаблоны маршрутов
В приложениях Blazor за маршрутизацию запросов к конкретным компонентам Blazor отвечает компонент Router, расположенный в главном компоненте приложения (по умолчанию — App):
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
<NotFound>
<p>Sorry, there's nothing at this address.</p>
</NotFound>
</Router>
При компиляции компонентов Razor (.razor) с указанной директивой @page, каждый созданный класс компонента предоставляет атрибут RouteAttribute для указания шаблона маршрута. При запуске приложения выполняется проверка сборки, указанной в компоненте Route как AppAssembly, для сбора сведений о маршрутах для компонентов приложения с указанными RouteAttribute.
Далее, в среде выполнения, компонент RouteView выполняет следующие операции:
- получает
RouteDataотRouterвместе со всеми параметрами маршрута; - сопоставляет указанный компонент для просмотра с его макетом, включая все вложенные макеты.
При необходимости, для компонента RouterView можно указать параметр DefaultLayout с классом макета для компонентов, которые не задают макет, с помощью директивы @layout. По умолчанию, в приложениях Blazor указывается компонент MainLayout (Shared/MainLayout.razor).
Свойства компонента Route
По умолчанию, в шаблоне приложения Blazor у компонента Route указаны следующие свойства:
Found— возвращает или задает содержимое, отображаемое при обнаружении соответствия для запрошенного маршрута.NotFound— возвращает или задает содержимое, отображаемое, если для запрошенного маршрута не найдено совпадений
Можно увидеть, как работают эти свойства, например, если попробовать перейти по несуществующему в приложении пути:
Иногда бывает необходимо показать пользователю какое-либо содержимое в момент, когда приложение обрабатывает какой-то долгий запрос, например, получает большой массив данных с другого веб-узла или производит чтение из базы данных и т.д. Чтобы это сделать, можно воспользоваться свойством Navigating компонента Router.
Navigating — возвращает или задает содержимое, отображаемое при выполнении асинхронной навигации.
Например, изменим содержимое компонента Router следующим образом:
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
....
</Found>
<NotFound>
.....
</NotFound>
<Navigating >
<PageTitle>Переходим по ссылке</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p>Загружаем страницу....</p>
</LayoutView>
</Navigating>
</Router>
Здесь, в свойстве Navigating мы задали текст заголовка страницы и указали компоненту LayoutView, что, используя шаблон MainLayout, пользователю следует указать на странице всего одну строку — «Загружаем страницу….». Теперь при каждом переходе к очередному компоненту приложения мы будем видеть эту строку.
Несколько маршрутов для компонента Blazor
В Blazor для компонентов можно указывать несколько директив @page. Например, воспользуемся шаблоном приложения Blazor и укажем для компонента Counter следующие маршруты:
@page "/counter" @page "/my_counter" @page "/counter/start"
Теперь можно запустить приложение и убедиться, что при переходе по ссылке «Counter» в меню, как и раньше, загрузится компонент счётчика по пути «/Counter«. При этом, мы можем перейти к этому же компоненту, набрав в адресной строке браузера путь «https://localhost:7167/my_counter» или «https://localhost:7167/counter/start»
Параметры маршрута
Достаточно часто работа одного компонента Blazor может зависеть от результатов работы другого компонента. В Blazor мы можем указывать параметры маршрута, чтобы компонент мог их использовать для выполнения каких-либо действий. Например, изменим компонент Counter следующим образом:
@page "/counter"
@page "/counter/start/{currentCount:int}"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @CurrentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
[Parameter]
public int CurrentCount { get; set; } = 0;
private void IncrementCount()
{
CurrentCount++;
}
}
Посмотрим, что изменилось в компоненте.
Во-первых, во второй директиве @page мы указали шаблон параметра {currentCount:int}, что означает, что путь в строке браузера обязательно должен иметь вид: путь_к_приложению/counter/start/целое_число. Например, следующие пути будут приводить к загрузке компонента Counter:
- https://localhost:7167/counter/start/30
- https://localhost:7167/counter/start/1
- https://localhost:7167/counter/start/0
Следующие пути приведут к ошибке:
- https://localhost:7167/counter/start/ — отсутствует обязательный параметр
- https://localhost:7167/counter/start/abcd — параметр определен как строка, а не целое число
Во-вторых, поле сurrentCount стало свойством CurrentCount и для этого свойства указан атрибут Parameter. Указание атрибута Parameter означает, что значение свойства CurrentCount при загрузке компонента будет браться из параметра пути с тем же именем, что и у свойства (регистр при этом не учитывается).
Теперь можно запустить приложение и убедиться, что при загрузке компонента по адресу «/counter» начальное значение счётчика равно 0, а, при загрузке, например, по пути https://localhost:7167/counter/start/100 значение счётчика сразу будет равно 100.
Необязательные параметры
Blazor поддерживает необязательные параметры маршрута. Например, мы можем изменить наш компонент Counter следующим образом:
@page "/counter/{currentCount:int?}"
здесь параметр currentCount — необязательный (в конце описания параметра стоит вопросительный знак). Теперь счётчик будет доступен либо по пути "/count" либо по любому пути, содержащему в качестве параметра целое число, например, "/counter/10", "counter/12" и т.д.
Ограничения маршрута
При указании параметра currentCount мы указали ограничения для этого параметра — int. Что означало, что в этом параметре могут содержаться целые числа. В Blazor можно также указать следующие ограничения для параметров:
| Ограничение | Пример | Примеры совпадений |
|---|---|---|
bool |
{active:bool} |
true, FALSE |
datetime |
{dob:datetime} |
2016-12-31, 2016-12-31 7:32pm |
decimal |
{price:decimal} |
49.99, -1,000.01 |
double |
{weight:double} |
1.234, -1,001.01e8 |
float |
{weight:float} |
1.234, -1,001.01e8 |
guid |
{id:guid} |
CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638} |
int |
{id:int} |
123456789, -123456789 |
long |
{ticks:long} |
123456789, -123456789 |
Итого
Сегодня мы познакомились с тем, как организована маршрутизация в приложениях в ASP.NET Core Blazor: рассмотрели работу компонента Router, возможности использования параметров и то, какие ограничения можно накладывать на параметры.

