Содержание
В Blazor содержится ряд встроенных компонентов, содержащих необходимые параметры и события для работы с формами. Эти компоненты основаны на стандартных html-элементах, таких как <input> и делают работу с формами более удобной и комфортной для разработчиков.
Компонент EditForm
Технически, в Blazor Hybrid для работы с формами мы можем использовать стандартный html-элемент <form>, как и любые другие html-элементы. Но, при этом, в Blazor также имеется (и рекомендуется к использованию) специальный компонент — EditForm. В отличие от обычного <form> компонент EditForm имеет дополнительные возможности, делающие работу с формами в Blazor более комфортной и удобной, а именно:
- возможность указания контекста (модели) данных с которыми мы будем работать
- возможность верификации введенных пользователем данных с использованием атрибутов модели.
Ниже мы рассмотрим пример использования этого компонента в приложении Blazor Hybrid.
Компоненты InputText InputCheckbox, InputDate, InputFile, InputNumber, InputRadio
Все эти компоненты Razor используют для визуализации стандартный html-элемент <input>:
| Компонент ввода | Вид в Html-документе |
|---|---|
InputCheckbox |
<input type="checkbox"> |
InputDate<TValue> |
<input type="date"> |
InputFile |
<input type="file"> |
InputNumber<TValue> |
<input type="number"> |
InputRadio<TValue> |
<input type="radio"> |
InputRadioGroup<TValue> |
Группа дочернего элемента InputRadio<TValue> |
InputText |
<input> |
Каждый из этих компонентов имеет свои параметры и события. Например, создадим новое приложение Blazor Hybrid и изменим код компонента Home следующим образом:
@page "/"
<EditForm Model="person" >
<label>
Имя:
<InputText @bind-Value="person.Name" DisplayName="Имя пользователя"></InputText>
</label>
<br />
<label>
Возраст:
<InputNumber TValue="int" @bind-Value="person.Age" DisplayName="Возраст пользователя"></InputNumber>
</label>
<br />
<label>
Является админом:
<InputCheckbox @bind-Value="person.IsAdmin" DisplayName="Признак администратора"></InputCheckbox>
</label>
<br />
<label>
Пароль:
<InputText type="password" @bind-Value="person.Password" DisplayName="Пароль"></InputText>
</label>
</EditForm>
@code{
PersonModel person = new();
class PersonModel
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsAdmin { get; set; }
public string Password { get; set; }
}
}
Рассмотрим этот код подробнее. Здесь мы определили в коде компонента модель данных — класс PersonModel с объектами которого мы будем далее работать.
class PersonModel
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsAdmin { get; set; }
public string Password { get; set; }
}
Также мы создали объект этого класса для того, чтобы в дальнейшем его использовать в работе с формой:
PersonModel person = new();
Теперь посмотрим на разметку компонента. Здесь представлена форма для ввода данных для пользователя. Для создания формы мы использовали компонент EditForm у которого определили обязательный параметр Model в котором в качестве значения указали созданный в коде объект person:
<EditForm Model="person" >
Внутри этого компонента мы располагаем встроенные компоненты Razor для работы с формами. И здесь обратите внимание, как используются компоненты InputText для ввода имени и пароля пользователя:
<InputText @bind-Value="person.Name" DisplayName="Имя пользователя"></InputText> ... <InputText type="password" @bind-Value="person.Password" DisplayName="Пароль"></InputText>
Так как компоненты поддерживают любые атрибуты, то во втором случае мы определили для компонента атрибут type="password", указав, что компонент используется для ввода пароля.
Что касается ввода чисел (возраста), то здесь мы использовали компонент InputNumber у которого обязательным является параметр TValue. В нашем случае, мы указали, что вводиться должны целые числа типа int:
<InputNumber TValue="int" @bind-Value="person.Age" DisplayName="Возраст пользователя"></InputNumber>
В качестве значения TValue мы можем указать следующие типы: Int32, Int64, Int16 , Single , Double или Decimal
Также мы использовали компонент InputCheckbox для отметки пользователя как администратора
<InputCheckbox @bind-Value="person.IsAdmin" DisplayName="Признак администратора"></InputCheckbox>
Это всего лишь заготовка формы, которую мы будем далее дорабатывать, поэтому вот такой её вид в запущенном приложении не должен вас смущать:
Теперь последовательно доработаем эту форму и начнем с визуального оформления.
Применение стиля к элементам формы
По умолчанию в Blazor Hybrid для визуального оформления элементов используется CSS-фреймворк Bootstrap. Рассмотрение этого фреймворка выходит за рамки Blazor и C#, в принципе, однако, вы всегда можете обратиться к официальной документации, чтобы понять как работают те или иные атрибуты компонентов. Я же продемонстрирую итоговый код нашего компонента Home с уже оформленной формой:
@page "/"
<EditForm Model="person" >
<div class="mb-2 row">
<label for="name" class="col-sm-2 col-form-label">Имя:</label>
<div class="col-sm-5">
<InputText id="name" class="form-control" @bind-Value="person.Name" DisplayName="Имя пользователя"></InputText>
</div>
</div>
<div class="mb-2 row">
<label for="age" class="col-sm-2 col-form-label"> Возраст:</label>
<div class="col-sm-1">
<InputNumber id="age" class="form-control" TValue="int" @bind-Value="person.Age" DisplayName="Возраст пользователя"></InputNumber>
</div>
</div>
<div class="mb-2 row">
<label for="isAdmin" class="col-sm-2 col-form-check-label">Является админом:</label>
<div class="col-sm-1">
<InputCheckbox id="isAdmin" class="form-check-input" @bind-Value="person.IsAdmin" DisplayName="Признак администратора"></InputCheckbox>
</div>
</div>
<div class="mb-2 row">
<label for="pass" class="col-sm-2 col-form-label">Пароль:</label>
<div class="col-sm-2">
<InputText id="pass" type="password" class="form-control" @bind-Value="person.Password" DisplayName="Пароль"></InputText>
</div>
</div>
</EditForm>
@code {
PersonModel person = new();
class PersonModel
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsAdmin { get; set; }
public string Password { get; set; }
}
}
Здесь каждое поле формы помещено в <div>, а также определены необходимые атрибуты class для html-элементов. Например, для полей ввода в Bootstrap применяется атрибут class="form-control". Теперь можно запустить приложение и посмотреть как изменился внешний вид формы:
Обратите внимание на то, что границы полей ввода «Имя» и «Возраст» выделены зеленым цветом. Так выделяются поля, прошедшие верификацию и так как мы ещё не определили никаких правил проверки введенных пользователем значений, то по умолчанию, считается, что все данные введены верно. Теперь добавим в наше приложение валидацию модели.
Валидация модели
Компонент EditForm поддерживает валидацию модели на основе атрибутов. Для этого изменим код компонента следующим образом:
@using System.ComponentModel.DataAnnotations
@page "/"
<EditForm Model="person" >
<DataAnnotationsValidator />
<ValidationSummary />
<div class="mb-2 row">
<label for="name" class="col-sm-2 col-form-label">Имя:</label>
<div class="col-sm-5">
<InputText id="name" class="form-control" @bind-Value="person.Name" DisplayName="Имя пользователя"></InputText>
</div>
</div>
<div class="mb-2 row">
<label for="age" class="col-sm-2 col-form-label"> Возраст:</label>
<div class="col-sm-1">
<InputNumber id="age" class="form-control" TValue="int" @bind-Value="person.Age" DisplayName="Возраст пользователя"></InputNumber>
</div>
</div>
<div class="mb-2 row">
<label for="isAdmin" class="col-sm-2 col-form-check-label">Является админом:</label>
<div class="col-sm-1">
<InputCheckbox id="isAdmin" class="form-check-input" @bind-Value="person.IsAdmin" DisplayName="Признак администратора"></InputCheckbox>
</div>
</div>
<div class="mb-2 row">
<label for="pass" class="col-sm-2 col-form-label">Пароль:</label>
<div class="col-sm-2">
<InputText id="pass" type="password" class="form-control" @bind-Value="person.Password" DisplayName="Пароль"></InputText>
</div>
</div>
<button type="submit" class="btn btn-primary">Отправить</button>
</EditForm>
@code {
PersonModel person = new();
class PersonModel
{
[Required(ErrorMessage ="Имя пользователя - обязательное поле")]
public string Name { get; set; }
public int Age { get; set; }
public bool IsAdmin { get; set; }
[StringLength(20, MinimumLength = 10, ErrorMessage = "Длина пароля должна быть не менее 10 символов")]
public string Password { get; set; }
}
}
Первое изменение, которое мы сделали — это подключили пространство имен
@using System.ComponentModel.DataAnnotations
для того, чтобы мы могли использовать атрибуты валидации. Второе — это, собственно, добавили в модель необходимые атрибуты и прописали в них текст ошибок:
class PersonModel
{
[Required(ErrorMessage ="Имя пользователя - обязательное поле")]
public string Name { get; set; }
public int Age { get; set; }
public bool IsAdmin { get; set; }
[StringLength(20, MinimumLength = 10, ErrorMessage = "Длина пароля должна быть не менее 10 символов")]
public string Password { get; set; }
}
и, наконец, третье — добавили в компонент EditForm два новый компонента:
<DataAnnotationsValidator />— включает поддержку валидации модели на основе атрибутов<ValidationSummary />— выводит список сообщений об обнаруженных ошибках валидации
Ну и, в качестве дополнения, добавили кнопку «Отправить» в форму:
<button type="submit" class="btn btn-primary">Отправить</button>
Теперь можно запустить приложение и посмотреть на результат. Запустите приложение и сразу нажмите кнопку «Отправить» — вы должны увидеть следующую ошибку валидации:
Теперь попробуйте ввести в поле формы несколько символов и снова повторить отправку. Так как предыдущая ошибка не была исправлена, то на экране вы увидите:
Соответственно, если форма будет заполнена верно, то после нажатия кнопки вы увидите следующий результат:
Таким образом, в этой части мы создали простенькую форму для ввода данных о пользователе и обеспечили её валидацию на основе атрибутов.
EditForm можно получить в этой статье, а о компонентах форм — здесь и здесьИтого
Для работы с элементами форм в Blazor имеются встроенные компоненты, поддерживающие двухстороннюю привязку, а также валидацию на основе атрибутов. Использование этих компонентов рекомендуется при разработке приложений.




