При разработке компонентов Razor мы можем использовать привязку данных параметров компонента к атрибутам HTML-элементов.
Атрибут @bind
С помощью атрибута @bind можно осуществлять привязку данных в компонентах Razor. Наиболее часто такая привязка осуществляется с использованием следующей конструкции
@bind-[ATTRIBUTE] = "[VALUE]"
Здесь [ATTRIBUTE] — это атрибут html-элемента, а [VALUE] — параметр, поле и выражение Razor. Например, часто пользователь должен вводить какие-либо данные в приложении, а приложение эти данные обрабатывать. Обычно для ввода данных в html используется элемент <input>. Создадим новое приложение Blazor Hybrid и рассмотрим и напишем следующий код компонента Home.razor:
@page "/"
<h1>Hello, @value!</h1>
<input type="text" @bind-value="value"></input>
@code{
private string value = "world";
}
Здесь мы привязали атрибут value элемента <input> к полю value компонента Razor. После запуска приложения вы увидите поле ввода:
введите какое-либо значение в это поле и нажмите Enter или Tab, чтобы элемент потерял фокус. Вы увидите, что значение поля value компонента Razor примет новое значение и это значение отобразится в заголовке:
Вообще, что касается элементов <input>, то для привязки к атрибуту value можно использовать атрибут @bind без указания value:
<input type="text" @bind="value"></input>
@bind:event
В предыдущем примере поле value компонента Razor привязывается к значению элемента <input> при срабатывании события onchange элемента, что предусмотрено по умолчанию. Именно поэтому мы видим изменение заголовка только тогда, когда html-элемент теряет фокус и срабатывает событие. С использованием атрибута @bind:event мы можем переопределить событие срабатывание которого будет приводить к привязке данных. Перепишем наш пример следующим образом:
@page "/"
<h1>Hello, @value!</h1>
<input type="text" @bind="value" @bind:event="oninput"></input>
@code{
private string value = "world";
}
Здесь мы, используя атрибут @bind:event переопределили событие для привязки данных с onchange на oninput. Теперь запустите приложение и попробуйте ввести какое-либо значение в поле ввода. Вы увидите, что значение заголовка страницы будет изменяться сразу же по мере ввода текста в поле, а не после того, как поле потеряет фокус.
@bind:get и @bind:set
Компоненты поддерживают двустороннюю привязку данных, определяя пару атрибутов @bind с модификатором :get или :set. При этом:
@bind:get/@bind-{ATTRIBUTE}:get— задает значение для привязки.@bind:set/@bind-{ATTRIBUTE}:set— Задает функцию обратного вызова при изменении значения
С привязкой :get/:set мы можем отреагировать на изменение значения до того, как оно будет применено к DOM, и при необходимости изменить применённое значение. Например,
@page "/"
<h1>Hello, @name!</h1>
<input type="text" @bind:set="Set" @bind:get="name" @bind:event="oninput"></input>
@code{
private string name = "world";
private void Set(string value)
{
name = value.ToUpper();
}
}
здесь значение для привязки — поле name компонента, а функция обратного вызова — Set() в которой мы переводим строку в верхний регистр. Теперь, если запустить приложение и попытаться ввести любое значение, то вы увидите, что все символы переводятся в верхний регистр:
Так как мы уже изучили вопрос обработки событий в html-элементах, то стоит особо отметить, что:
@bind:get/@bind:set. Использование для двухсторонней привязки обработчиков событий элементов является неверным.@bind:after
Атрибут @bind:after используется для асинхронной обработки после привязки значения. Например,
@page "/"
<h1>Hello, @name!</h1>
<input type="text" @bind="name" @bind:after="After" @bind:event="oninput"/>
@code{
private string name = "world";
private async Task After()
{
await Task.Delay(1000);
name = "world";
}
}
Запустите приложение и убедитесь, что спустя 1 секунду заголовок страницы возвращается к первоначальному значению. Постобработку данных с использованием @bind:after удобно использовать, например, если вы хотите динамически выводить результаты поиска. Например,
@page "/"
<h1>Поиск</h1>
<input type="text" @bind="search" @bind:after="After" @bind:event="oninput"/>
<ul>
@foreach (var s in found)
{
<li>@s</li>
}
</ul>
@code{
private static string[] strings = ["Android", "Apple", "Ant", "Blazor", "Blazor Hybrid"];
private string[] found = strings;
private string search = "world";
private void After()
{
found = strings.Where(f => f.StartsWith(search)).ToArray();
}
}
здесь постобработка в @bind:after приводит к тому, что по мере ввода текста в <input> будет производиться поиск в массиве strings и результаты поиска будут динамически выводиться на странице.
@bind:format
Используя @bind:format, мы можем задать свой формат строки для привязки. Этот атрибут удобно использовать, например, для форматирования даты/времени:
@page "/"
<input @bind="startDate" @bind:format="dd-MM-yyyy" />
@code {
private DateTime startDate = new(2024, 12, 30);
}
Результат:
Итого
Для привязки данных в компонентах используется атрибут @bind, для которого могут применяться различные модификаторы. Двухсторонняя привязка должна осуществляться с помощью пары @bind:get/@bind:set, для постобработки данных используется @bind:after, а для форматирования строк — @bind:format.



