Для вывода сообщений об ошибках в компонентах Blazor применяются два встроенных компонента - ValidationSummary и ValidationMessage.
Оба они расположены в пространстве имен Microsoft.AspNetCore.Components.Forms
.
ValidationSummary выводит все сообщения об ошибках. На уровне разметки html генерируется html-элемент <ul>
с классом
validation-errors
<ul class="validation-errors"> <li class="validation-message">Сообщение об ошибке 1</li> <li class="validation-message">Сообщение об ошибке 2</li> ........................ <li class="validation-message">Сообщение об ошибке N</li> </ul>
В этот список добавляются все сообщения об ошибках в виде элемента с классом validation-message
.
Пусть у нас в проекте есть класс Person, который представляет данные, и два компонента - App и Home:
Пусть класс Person применяет атрибуты валидации:
using System.ComponentModel.DataAnnotations; public class Person { [Required] [StringLength(20, MinimumLength =2)] public string? Name { get; set; } [Required] [Range(1,110)] public int Age { get; set; } }
Пусть компонент App представляет корневой компонент и просто выводит на страницу компонент Home:
@page "/" <!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <Home /> <script src="_framework/blazor.web.js"></script> </body> </html>
А в компоненте Home определим форму для ввода данных этого класса и с помощью ValidationSummary выведем ошибки валидации:
@using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Web @rendermode RenderMode.InteractiveServer <EditForm Model="@person" OnSubmit="Submit"> <DataAnnotationsValidator /> <ValidationSummary /> <p> Name:<br /> <InputText id="name" @bind-Value="person.Name" /> </p> <p> Age:<br /> <InputNumber id="age" @bind-Value="person.Age" /> </p> <button type="submit">Submit</button> </EditForm> @code { Person person = new(); void Submit() { Console.WriteLine($"Name: {person.Name} \tAge: {person.Age}"); } }
Если в данном случае мы введем некорректные значения, то компонент ValidationSummary будет формировать следующую разметку:
<ul class="validation-errors"> <li class="validation-message">The field Age must be between 1 and 110.</li> <li class="validation-message">The field Name must be a string with a minimum length of 2 and a maximum length of 20.</li> </ul>
Компонент ValidationMessage<T> отображает сообщение об ошибке для отдельного свойства модели. Этот компонент генерирует html-элемент
<div>
с классом validation-message
, который содержит сообщение об ошибке.
С помощью свойства For компонент ValidationMessage
устанавливает валидируемое свойство модели через передаваемое лямбда-выражение.
Например, изменим компонент Home следующим образом:
@using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Web @rendermode RenderMode.InteractiveServer <EditForm Model="@person" OnSubmit="Submit"> <DataAnnotationsValidator /> <p> Name:<br /> <InputText id="name" @bind-Value="person.Name" /><br /> <ValidationMessage For="@(() => person.Name)" /> </p> <p> Age:<br /> <InputNumber id="age" @bind-Value="person.Age" /><br /> <ValidationMessage For="@(() => person.Age)" /> </p> <button type="submit">Submit</button> </EditForm> @code { Person person = new(); void Submit() { Console.WriteLine($"Name: {person.Name} \tAge: {person.Age}"); } }
Теперь сообщения об ошибках отображаются рядом с каждым полем ввода
Стилизируя классы validation-errors
и validation-message
, можно настроить вывод сообщений об ошибках. Например, определим в компоненте
App примитивную стилизацию:
@using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Web @rendermode RenderMode.InteractiveServer <style> .validation-errors { color: red; } div.validation-message{ color: #2980B9; } </style> <EditForm Model="@person" OnSubmit="Submit"> <DataAnnotationsValidator /> <ValidationSummary /> <p> Name:<br /> <InputText id="name" @bind-Value="person.Name" /><br /> <ValidationMessage For="@(() => person.Name)" /> </p> <p> Age:<br /> <InputNumber id="age" @bind-Value="person.Age" /><br /> <ValidationMessage For="@(() => person.Age)" /> </p> <button type="submit">Submit</button> </EditForm> @code { Person person = new(); void Submit() { Console.WriteLine($"Name: {person.Name} \tAge: {person.Age}"); } }
В данном случае для ошибок в ValidationSummary применяется красный цвет, а для ValidationMessage - синий цвет: