Работа с формами в Blazor (компонент EditForm)

Далеко не последнюю роль при работе с 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 для ввода пользователем своих данных, а также кнопка «Отправить». В работающем приложении эта форма будет выглядеть следующим образом:

EditForm blazor

Для формы определен обработчик события 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

При работе с формами (и, в принципе с моделями данных) нам желательно делать какие-либо проверки введенных данных. Например, чтобы пользователь не вводил отрицательное значение возраста или его имя состояло более, чем из одного символа и так далее.

Опять же, чисто технически, мы можем проводить все эти проверки вручную, например. в том же методе 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 определено два обработчика события:

  1. OnInvalidSubmit — обработчик сработает в том случае, если при валидации модели будут обнаружены какие-либо ошибки;
  2. OnValidSubmit — сработает, если все данные будут верными

во-вторых, у компонента EditForm дополнительно включены два элемента:

  1. <DataAnnotationsValidator /> — включает поддержку валидации модели на основе атрибутов
  2. <ValidationSummary /> — выводит список сообщений об обнаруженных ошибках валидации

в-третьих, в классе модели (PersonModel) для свойства Name использованы два атрибута:

  1. [Required] — указывает на то, что свойство является обязательным для заполнения
  2.  [StringLength(50, MinimumLength = 2, ErrorMessage = "Длина строки с именем должна быть не менее 2х и не более 50ти символов")]— устанавливает минимальную и максимальную длину строки имени, а также задает текст ошибки, который будет выведен пользователю.

Теперь запустим приложение и проверим его работу. При попытке оставить поле с именем пустым, мы увидим:

OnInvalidSubmit

При вводе в поле только одного символа:

Ну и, соответственно, когда мы введем более одного символа в поле с именем, то валидация формы пройдет успешно:

Итого

Для работы с формами в Blazor мы имеем возможность использовать обычный html-элемент <form>, однако, с точки зрения удобства и комфортной работы, желательно использование специального компонента Blazor — EditForm, который позволяет нам проводить верификацию модели, используя атрибуты модели и выводить список ошибок пользователю, не прибегая к использованию каких-либо сторонних средств и js-скриптов.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии