Содержание
При разработке приложений Blazor бывает необходимо перенаправить пользователя на другой URL без каких-либо действий со стороны самого пользователя. Например, такое поведение приложения может потребоваться в случае, когда у вас предусмотрена отдельная страница добавления пользователем каких-либо данных в приложение. После заполнения формы пользователь жмет кнопку «Добавить», срабатывает событие OnSubmit формы и в этот момент вам может потребоваться, чтобы пользователь вернулся, например, на главную страницу приложения. В этом случае нам поможет класс C# Navigation.
Navigation позволяет управлять URI непосредственно в коде C#. Рассмотрим одно из наиболее часто встречающихся применений этого класса.
@page "/navigate"
@inject NavigationManager Navigation
<button class="btn btn-primary" @onclick="NavigateToMainPage">
Navigate to the main page
</button>
@code {
private void NavigateToMainPage()
{
Navigation.NavigateTo("/");
}
}
Здесь, после директивы @page (об этой директиве мы говорили здесь) используется директива @inject с помощью которой мы внедряем новый сервис в наш компонент Blazor. Директива @inject имеет следующее описание:
@inject тип название
тип— тип внедряемого сервиса (службы). В нашем случае — этоNavigationManager.название— имя переменной, с которой мы будем работать в коде C#. В нашем случае — этоNavigation.
После того, как служба внедрена в компонент, мы можем её использовать в коде C#. Далее, в примере выше, мы добавляем новую кнопку и задаем обработчик события onclick:
@onclick="NavigateToMainPage"
и уже в самом обработчике, используя NavigationManager, перенаправляем пользователя на главную страницу приложения, используя один из методов NavigateTo:
private void NavigateToMainPage()
{
Navigation.NavigateTo("/");
}
Теперь, как только пользователь нажмет на кнопку, он будет перенаправлен на главную страницу приложения.
Свойство BaseUri
Возвращает базовый URI (с завершающей косой чертой), который можно добавить в начало относительных путей URI для получения абсолютного URI. Обычно, BaseUri соответствует атрибуту href элемента документа <base> в wwwroot/index.html (Blazor WebAssembly) или Pages/_Host.cshtml (Blazor Server).
Например, https://localhost:7056
Свойство Uri
Возвращает текущий абсолютный URI, например, https://localhost:7056/counter.
Метод NavigateTo
Позволяет переходить по указанному URL. Этот метод перегружен и имеет несколько версий. Наиболее часто используются следующие версии метода:
public void NavigateTo (string uri); public void NavigateTo (string uri, bool forceLoad);
здесь uri — URL по которому необходимо перейти
forceLoad — если значение параметра равно true, обходит маршрутизацию на стороне клиента и заставляет браузер загружать новую страницу с сервера, независимо от того, будет ли URI обычно обрабатываться маршрутизатором на стороне клиента.
Метод ToAbsoluteUri
Преобразует относительный URL в абсолютный. Этот метод имеет следующую сигнатуру
public Uri ToAbsoluteUri (string relativeUri);
Метод ToBaseRelativePath
Преобразует абсолютный URI в относительный URI (относительно базового префикса). Метод имеет следующую сигнатуру:
public string ToBaseRelativePath (string uri);
Событие LocationChanged
Событие, возникающее при изменении расположения навигации.
public event EventHandler<LocationChangedEventArgs> LocationChanged;
В примере ниже при переходе на новую страницу с использованием Navigation в консоль выводится несколько строк, содержащие различные свойства и результаты работы методов у Navigation.
@page "/"
@using Microsoft.Extensions.Logging;
@implements IDisposable;
@inject ILogger<Index> Logger;
@inject NavigationManager Navigation;
<button @onclick=OnClick>Go To Counter</button>
@code {
public void OnClick()
{
Navigation.NavigateTo("/counter");
}
protected override void OnInitialized()
{
Navigation.LocationChanged += HandleLocationChanged;
}
private void HandleLocationChanged(object sender, LocationChangedEventArgs e)
{
Logger.LogInformation("URL новой страницы: {Location}", e.Location);
Logger.LogInformation("Относительный путь: {Location}", Navigation.ToBaseRelativePath(e.Location));
Logger.LogInformation("Базовый URL: {Location}", Navigation.BaseUri);
}
public void Dispose()
{
Navigation.LocationChanged -= HandleLocationChanged;
}
}
После перехода на новый URL в консоли приложения можно увидеть следующие строки:
Относительный путь: counter
Базовый URL: https://localhost:7056/
Итого
Сегодня мы рассмотрели пример навигации в Blazor с использованием сервиса Navigation. Для того, чтобы перенаправить пользователя на новый URL с использованием кода C# мы должны воспользоваться одной из версий методы NavigateTo(). После перехода на новый URL у компонента Navigation возникает событие LocationChanged.