При разработке приложений в Blazor бывает необходимым получать значения свойств компонентов не только из параметров маршрута, но и использовать для сохранения/передачи состояния компонента параметры запроса (URL Query Parameters). Например, использование параметров URL в Blazor может потребоваться для фильтрации данных перед выводом их на экран. В этом случае, URL может выглядеть, например, так http://localhost:5001/component/1?filter=a&filter2=b… Рассмотрим, как использовать параметры URL в Blazor.
Вариант для Blazor .NET 5
На примере демонстрационного компонента Blazor Counter чтение параметров URL можно организовать, например, таким способом:
@page "/counter"
@inject NavigationManager _navigation
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
protected override void OnParametersSet()
{
Uri uri = new(_navigation.Uri);
var queryDictionary = System.Web.HttpUtility.ParseQueryString(uri.Query);
string count = queryDictionary.Get("count");
if (!string.IsNullOrEmpty(count))
{
currentCount = int.Parse(count);
}
}
private void IncrementCount()
{
currentCount++;
}
}
Во-первых, здесь мы используем NavigationManager, чтобы получить URI запроса. Далее, мы переопределяем метод компонента OnParametersSet в котором, используя класс HttpUtility, преобразуем строку с параметрами запроса в коллекцию типа NameValueCollection. После этого, проверяем есть ли в коллекции пара с заданным ключом и пробуем преобразовать значение этой пары в значение типа int и присвоить это значение свойству currentCount.
Работающий пример будет выглядеть, например, так:
То есть, после того как мы передаем в URL параметр count, счётчик получает переданное значение. В принципе, подход рабочий, хоть и требует написание дополнительного кода. В .NET 6 появилась новая возможность работы с параметрами URL в Blazor — с использованием атрибутов.
Вариант для Blazor .NET 6
Тот же самый пример со счётчиком можно переписать в .NET 6 следующим образом:
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
[SupplyParameterFromQuery(Name ="count")]
[Parameter]
public int? currentCount { get; set; } = 0;
private void IncrementCount()
{
currentCount++;
}
}
Здесь мы уже не используем NavigationManager, но, вместо этого, используем новый атрибут в .NET 6 — SupplyParameterFromQuery. Этот атрибут можно использовать только для свойств компонента. То есть такой код приведет к ошибке:
[SupplyParameterFromQuery(Name ="count")] private int currentCount = 0;
Поэтому поле currentCount мы сделали параметром компонента Blazor. Если указать атрибут SupplyParameterFromQuery без свойства Name, то это будет подразумевать, что строка параметров URL должна содержать параметр с именем, совпадающим с названием свойства компонента.
Таким образом, используя атрибут SupplyParameterFromQuery , мы можем передавать в URL различное количество параметров и присваивать их значения значениям параметров компонента Blazor.
Итого
Для использования параметров URL в Blazor мы можем воспользоваться как своим кодом, например, на основе использования классов NavigationManager и HttpUtility, так и, начиная с .NET 6, использовать специальный атрибут SupplyParameterFromQuery для указания того, что значение параметра компонента Blazor должно получаться из параметров URL.
