29-4 Validations
Il est facile de valider les formulaires puisqu'ils sont liés à des modèles (DTO) et que des validations via DataAnnotation
sont appliquées à ces derniers.
Ajout de <DataAnnotationsValidator />
Pour ajouter le support des validations via DataAnnotation
, ajoutez simplement <DataAnnotationsValidator />
à l'intérieur de EditForm
.
<!-- ... -->
<div class="col-lg-6">
<EditForm Model="_creerEvenementDto" OnSubmit="GererSubmit">
<DataAnnotationsValidator />
<div class="form-floating mb-3">
<InputText id="nom" class="form-control" placeholder="Nom" @bind-Value="_creerEvenementDto.Nom"/>
<label asp-for="nom">Nom</label>
</div>
<!-- ... -->
Afficher le message d'erreur associé via <ValidationMessage>
Ensuite, il suffit d'ajouter le composant <ValidationMessage>
aux endroits où vous désirez afficher un message d'erreur lié à un champ.
<div class="col-lg-6">
<EditForm Model="_creerEvenementDto" OnSubmit="GererSubmit">
<DataAnnotationsValidator />
<div class="form-floating mb-3">
<InputText id="nom" class="form-control" placeholder="Nom" @bind-Value="_creerEvenementDto.Nom"/>
<label asp-for="nom">Nom</label>
<ValidationMessage class="invalid-feedback" For="@(() => _creerEvenementDto.Nom)" />
</div>
<!-- ... -->
ValidationMessage
est un composant de Blazor permettant d'afficher les messages d'erreur automatiquementFor=
prends en paramètre une fonction anonyme identifiant le champ du modèle auquel la validation s'applique.
Support pour les messages d'erreur bootstrap invalid-feedback
Bootstrap affiche les messages d'erreur via la classe CSS .invalid-feedback
. Par défaut, les éléments ayant la classe .invalid-feedback
sont cachés.
Pour que le message soit affiché, il doit être adjacent à un champ (input par exemple) ayant la classe css .is-invalid
.
Or, Blazor assigne la classe css .invalid
au input
(et non .is-invalid
). Il est difficile de changer ce comportement, alors qu'il est assez facile de modifier Bootstrap puisqu'on utilise du Sass! 😎
Ajoutez ceci à votre app.scss
(ou fichier _general.scss
si vous l'avez et qu'il est importé dans app.scss
):
//...
.invalid {
@extend .is-invalid;
}
//...
L'idée ici est qu'on dit que la classe CSS .invalid
"extend" .is-invalid
de Bootstrap et aura donc le même comportement.
L'effet est qu'un élément ayant la classe CSS .invalid-feedback
sera aussi affiché lorsqu'adjacent à un input avec la classe .invalid
.
Utilisation de OnValidSubmit
pour déclencher les validations
Plutôt que OnSubmit
sur le formulaire, on peut utiliser OnValidSubmit
. Comme le nom l'indique, cela aura pour effet de déclencher le processus de validation et de ne pas permettre de soumettre le formulaire tant et aussi longtemps que ce dernier n'est pas valide.
<!-- ... -->
<div class="col-lg-6">
<EditForm Model="_creerEvenementDto" OnValidSubmit="GererSubmit">
<DataAnnotationsValidator />
<!-- ... -->
Test
Vous pouvez essayer de soumettre le formulaire et tout champ n'étant pas valide sera affiché en rouge, plus un message d'erreur pour Nom
(puisqu'il est le seul pour lequel on a ajouté <ValidationMessage>
)
Compléter pour les autres champs
Il suffit de compléter pour les autres champs en ajoutant le composant <ValidationMessage>
à ces derniers.
Je vous laisse le soin de le faire 🙂
Vous pouvez réessayer et les messages d'erreur devraient être affichés pour les autres champs.
Modifier et traduire les messages génériques
Peut-être avez-vous remarqué que si vous n'entrez rien dans un champ qui a une valeur par défaut (0 pour capacité par exemple), vous avec un message d'erreur du genre:
Ce message d'erreur vient d'une erreur de Parsing
en bon français. Pour modifier cette erreur, on peut ajouter une propriété ParsingErrorMessage
sur le champ et préciser le message.
Par exemple:
<div class="form-floating mb-3">
<InputNumber id="capacite"
class="form-control"
placeholder="Capacité"
ParsingErrorMessage="La capacité doit être un nombre"
@bind-Value="_creerEvenementDto.Capacite"/>
Vous pouvez évidemment lier le tout à un fichier ressource.