Далеко не последнюю роль при работе с Blazor играет заполнение пользователем различных форм и верификация введенных данных. На данный момент мы уже знаем как проводится обработка событий в Blazor и двухсторонняя привязка данных, поэтому сегодня мы можем начинать разбираться с формами в Blazor и тем, как верифицировать введенные пользователем данные.
EditForm vs <form>
Технически, в Blazor для работы с формами мы можем использовать стандартный html-элемент <form>, как и любые другие html-элементы. Но, при этом, в Blazor также имеется (и рекомендуется к использованию) специальный компонент — EditForm. В отличие от обычного <form> компонент EditForm имеет дополнительные возможности, делающие работу с формами в Blazor более комфортной и удобной, а именно:
- возможность указания контекста (модели) данных с которыми мы будем работать
- возможность верификации введенных пользователем данных с использованием атрибутов модели.
Именно поэтому мы, в дальнейшем и будем использовать именно EditForm.
Простой пример формы Blazor
Для начала, рассмотрим простой пример формы Blazor, в которой пользователь вводит свой данные:
@inject ILogger<PersonModel> Logger
<EditForm Model="person" OnSubmit="OnSubmit">
<label for="personName">
Введите имя
<InputText @bind-Value="person.Name" id="personName"></InputText>
</label>
<br/>
<label for="personAge">
Введите возраст
<InputNumber @bind-Value="person.Age"></InputNumber>
</label>
<br/>
<button type="submit">Отправить</button>
</EditForm>
@code
{
public class PersonModel
{
public string Name { get; set; }
public int Age { get; set; }
}
PersonModel person = new PersonModel();
private void OnSubmit()
{
Logger.LogInformation("Сработало событие OnSubmit");
}
}
Здесь используется компонент EditForm, для которого определена модель типа PersonModel. На форме расположены два компонента Blazor — InputText и InputNumber для ввода пользователем своих данных, а также кнопка «Отправить». В работающем приложении эта форма будет выглядеть следующим образом:
Для формы определен обработчик события OnSubmit, который сработает, когда пользователь нажмет кнопку «Отправить». При этом, обратите внимание, что для самой кнопки никаких обработчиков событий типа @onclick определять не требуется, а необходимо только указать тип кнопки type="submit".
Html-код формы в приложении будет выглядеть следующим образом:
<form>
<label for="personName">
Введите имя
<input id="personName" class="valid"></input></label>
<br>
<label for="personAge">
Введите возраст
<input step="any" type="number" class="valid" value="0"></input></label>
<br>
<button type="submit">Отправить</button>
</form>
Здесь мы не проводим никаких проверок введенных пользователем данных, поэтому, если нажать на кнопку «Отправить», то в консоли мы увидим следующий текст:
Валидация модели в EditForm
При работе с формами (и, в принципе с моделями данных) нам желательно делать какие-либо проверки введенных данных. Например, чтобы пользователь не вводил отрицательное значение возраста или его имя состояло более, чем из одного символа и так далее.
Опять же, чисто технически, мы можем проводить все эти проверки вручную, например. в том же методе OnSubmit и, при обнаружении ошибок, каким-либо образом сообщать об этом пользователю. Но это не самый удобный и универсальный метод, особенно, если наша модель используется в нескольких местах приложения.
Компонент EditForm может проводить валидацию модели (правильность введенных пользователем данных), используя атрибуты модели. Доработаем наш пример, чтобы увидеть как работает валидация модели в EditForm.
@using System.ComponentModel.DataAnnotations
<EditForm Model="person" OnInvalidSubmit="OnInvalidSubmit" OnValidSubmit="OnSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<label for="personName">
Введите имя
<InputText @bind-Value="person.Name" id="personName"></InputText>
</label>
<br/>
<label for="personAge">
Введите возраст
<InputNumber @bind-Value="person.Age"></InputNumber>
</label>
<br/>
<button type="submit">Отправить</button>
</EditForm>
@code
{
public class PersonModel
{
[Required]
[StringLength(50, MinimumLength = 2, ErrorMessage = "Длина строки с именем должна быть не менее 2х и не более 50ти символов")]
public string Name { get; set; }
public int Age { get; set; }
}
PersonModel person = new PersonModel();
private void OnInvalidSubmit()
{
Logger.LogInformation("Сработало событие OnInvalidSubmit");
}
private void OnSubmit()
{
Logger.LogInformation("Сработало событие OnSubmit");
}
}
На что в этом примере обратить внимание:
во-первых, для компонента EditForm определено два обработчика события:
OnInvalidSubmit— обработчик сработает в том случае, если при валидации модели будут обнаружены какие-либо ошибки;OnValidSubmit— сработает, если все данные будут верными
во-вторых, у компонента EditForm дополнительно включены два элемента:
<DataAnnotationsValidator />— включает поддержку валидации модели на основе атрибутов<ValidationSummary />— выводит список сообщений об обнаруженных ошибках валидации
в-третьих, в классе модели (PersonModel) для свойства Name использованы два атрибута:
[Required]— указывает на то, что свойство является обязательным для заполнения-
[StringLength(50, MinimumLength = 2, ErrorMessage = "Длина строки с именем должна быть не менее 2х и не более 50ти символов")]— устанавливает минимальную и максимальную длину строки имени, а также задает текст ошибки, который будет выведен пользователю.
Теперь запустим приложение и проверим его работу. При попытке оставить поле с именем пустым, мы увидим:
При вводе в поле только одного символа:
Ну и, соответственно, когда мы введем более одного символа в поле с именем, то валидация формы пройдет успешно:
Итого
Для работы с формами в Blazor мы имеем возможность использовать обычный html-элемент <form>, однако, с точки зрения удобства и комфортной работы, желательно использование специального компонента Blazor — EditForm, который позволяет нам проводить верификацию модели, используя атрибуты модели и выводить список ошибок пользователю, не прибегая к использованию каких-либо сторонних средств и js-скриптов.




