Exercice : ajouter la validation des données côté serveur et côté client au formulaire d’adresse

Effectué

Blazor peut lier des formulaires à des modèles dans votre application. Si vous décorez ces modèles avec des annotations de données, vous pouvez obtenir des validations côté client et côté serveur sans écrire davantage de code.

L’application ne passe pas les commandes quand un client n’entre pas de nom ni certains champs d’adresse. L’équipe vous demande d’améliorer les validations pour inclure plus de champs. L’équipe souhaite également définir des longueurs minimales et ajouter une validation de caractère.

Dans cet exercice, vous allez remplacer la validation côté serveur actuelle pour utiliser des annotations de données. Vous allez découvrir comment gérer les messages de validation et améliorer le support de validation prêt à l’emploi. La dernière étape consiste à contrôler la façon dont le formulaire est envoyé, c’est-à-dire qu’un formulaire est envoyé uniquement quand l’ensemble des champs sont valides.

Ajouter des annotations de données à un modèle Blazor

  1. Dans Visual Studio Code, développez Modèle, puis sélectionnez Address.cs.

  2. Ajoutez une référence à System.ComponentModel.DataAnnotations en haut de la classe.

    using System.ComponentModel.DataAnnotations;
    
  3. Pour chaque champ obligatoire, ajoutez une annotation de données.

    public class Address
    {
        public int Id { get; set; }
    
        [Required, MinLength(3), MaxLength(100)]
        public string Name { get; set; }
    
        [Required, MinLength(5), MaxLength(100)]
        public string Line1 { get; set; }
    
        [MaxLength(100)]
        public string Line2 { get; set; }
    
        [Required, MinLength(3), MaxLength(50)]
        public string City { get; set; }
    
        [Required, MinLength(3), MaxLength(20)]
        public string Region { get; set; }
    
        [Required, RegularExpression(@"^([0-9]{5})$")]
        public string PostalCode { get; set; }
    }
    
  4. Dans l’Explorateur de fichiers, développez Pages, puis sélectionnez Checkout.razor.

  5. Au-dessus de l’étiquette </EditForm> fermante, ajoutez le résumé de validation et le validateur des annotations de données.

        <ValidationSummary />
        <DataAnnotationsValidator />
      </EditForm>
    </div>
    
  6. Dans l’étiquette EditForm, remplacez le paramètre OnSubmit pour utiliser l’envoi valide.

      <EditForm Model=Order.DeliveryAddress OnValidSubmit=PlaceOrder>
    
  7. Vous pouvez maintenant supprimer la logique côté serveur personnalisée pour tester la validité de l’adresse. Supprimez la méthode CheckSubmission dans le bloc @code.

Tester les nouvelles validations des annotations de données

  1. Dans Visual Studio Code, appuyez sur F5 ou sélectionnez Exécuter>Démarrer le débogage.

    Essayez de commander des pizzas sans entrer d’informations, puis en fournissant des informations incomplètes. Observez les messages d’erreur détaillés pour chaque champ.

    Capture d’écran des messages d’erreur pour chaque champ.

    Cette interaction améliore les contrôles d’erreur pour chaque champ, mais l’erreur concernant chaque champ est bien mieux placée à côté du champ associé.

  2. Appuyez sur Maj + F5 pour arrêter l’exécution de l’application.

Améliorer les messages d’erreur EditFrom

  1. Dans l’Explorateur de fichiers, développez Pages, puis sélectionnez Checkout.razor.

  2. Supprimez le composant Blazor <ValidationSummary />.

            <DataAnnotationsValidator />
      </EditForm>
    </div>
    
  3. Dans l’Explorateur de fichiers, développez Pages, puis sélectionnez AddressEditor.razor.

  4. Sous chaque champ, ajoutez un message de validation personnalisé.

    <div class="form-field">
        <label>Name:</label>
        <div>
            <InputText @bind-Value="Address.Name" />
            <ValidationMessage For="@(() => Address.Name)" />
        </div>
    </div>
    
    <div class="form-field">
        <label>Line 1:</label>
        <div>
            <InputText @bind-Value="Address.Line1" />
            <ValidationMessage For="@(() => Address.Line1)" />
        </div>
    </div>
    
    <div class="form-field">
        <label>Line 2:</label>
        <div>
            <InputText @bind-Value="Address.Line2" />
            <ValidationMessage For="@(() => Address.Line2)" />
        </div>
    </div>
    
    <div class="form-field">
        <label>City:</label>
        <div>
            <InputText @bind-Value="Address.City" />
            <ValidationMessage For="@(() => Address.City)" />
        </div>
    </div>
    
    <div class="form-field">
        <label>Region:</label>
        <div>
            <InputText @bind-Value="Address.Region" />
            <ValidationMessage For="@(() => Address.Region)" />
        </div>
    </div>
    
    <div class="form-field">
        <label>Postal code:</label>
        <div>
            <InputText @bind-Value="Address.PostalCode" />
            <ValidationMessage For="@(() => Address.PostalCode)" />
        </div>
    </div>
    
  5. Dans l’Explorateur de fichiers, développez Modèle, puis sélectionnez Address.cs.

  6. Ajoutez un message d’erreur personnalisé pour l’annotation de données de chaque champ.

    public class Address
    {
        public int Id { get; set; }
    
        [Required, MinLength(3, ErrorMessage = "Please use a Name bigger than 3 letters."), MaxLength(100, ErrorMessage = "Please use a Name less than 100 letters.")]
        public string Name { get; set; }
    
        [Required, MinLength(5, ErrorMessage = "Please use an Address bigger than 5 letters."), MaxLength(100, ErrorMessage = "Please use an Address less than 100 letters.")]
        public string Line1 { get; set; }
    
        [MaxLength(100)]
        public string Line2 { get; set; }
    
        [Required, MinLength(3, ErrorMessage = "Please use a City bigger than 3 letters."), MaxLength(50, ErrorMessage = "Please use a City less than 50 letters.")]
        public string City { get; set; }
    
        [Required, MinLength(3, ErrorMessage = "Please use a Region bigger than 3 letters."), MaxLength(20, ErrorMessage = "Please use a Region less than 20 letters.")]
        public string Region { get; set; }
    
        [Required, RegularExpression(@"^([0-9]{5})$", ErrorMessage = "Please use a valid Postal Code with five numbers.")]
        public string PostalCode { get; set; }
    }
    

Tester les nouvelles validations des annotations de données

  1. Dans Visual Studio Code, appuyez sur F5 ou sélectionnez Exécuter>Démarrer le débogage.

    Image GIF animée montrant les messages d’erreur pour chaque champ qui s’affiche quand les données ne sont pas valides.

    Le formulaire d’adresse affiche dynamiquement un message d’erreur sous un champ qui contient des données non valides. Cette interaction se produit côté client et empêche les clients d’entrer des adresses incorrectes.

  2. Appuyez sur Maj + F5 pour arrêter l’exécution de l’application.

Restaurer le message d’erreur global et désactiver le bouton Envoyer

  1. Dans l’Explorateur de fichiers, développez Pages, puis sélectionnez Checkout.razor.

  2. Ajoutez un paramètre OnInvalidSubmit qui va appeler une méthode ShowError sur le composant EditForm.

    <EditForm Model=Order.DeliveryAddress OnValidSubmit=PlaceOrder OnInvalidSubmit=ShowError> 
    
  3. Ajoutez une méthode ShowError qui met à jour la propriété isError.

    protected void ShowError()
    {
        isError = true;
    }     
    
  4. Modifiez la méthode PlaceOrder pour mettre à jour les propriétés isError et isSubmitting.

    async Task PlaceOrder()
    {
        isError = false;
        isSubmitting = true;
        var response = await HttpClient.PostAsJsonAsync(
            $"{NavigationManager.BaseUri}orders", OrderState.Order);
        var newOrderId= await response.Content.ReadFromJsonAsync<int>();
        OrderState.ResetOrder();
        NavigationManager.NavigateTo($"myorders/{newOrderId}");
    } 
    
  5. Dans Visual Studio Code, appuyez sur F5 ou sélectionnez Exécuter>Démarrer le débogage.

    Capture d’écran du message d’erreur global affiché.

    Le message d’erreur s’affiche si le client tente d’envoyer un formulaire non valide.

  6. Appuyez sur Maj + F5 pour arrêter l’exécution de l’application.

Activer le bouton Envoyer quand tous les champs sont corrects

Est-ce que l’expérience utilisateur est meilleure si un client ne peut pas envoyer son commande tant que tous les champs ne sont pas renseignés ? Nous allons modifier la page de validation pour prendre en charge cette exigence. Modifiez le EditForm pour utiliser un EditContext au lieu d’un modèle.

  1. Dans l’Explorateur de fichiers, développez Pages, puis sélectionnez Checkout.razor.

  2. Mettez à jour l’élément EditFrom.

    <EditForm EditContext=editContext OnValidSubmit=PlaceOrder> 
    
  3. Modifiez l’élément de bouton pour utiliser le paramètre isError.

    <button class="checkout-button btn btn-warning" type="Submit" disabled=@isError>
    
  4. Dans le bloc @code, ajoutez une déclaration pour le nouveau EditContext.

    private EditContext editContext;
    
  5. Initialisez le contexte avec l’adresse de livraison de la commande.

    protected override void OnInitialized()
    {
        editContext = new(Order.DeliveryAddress);
        editContext.OnFieldChanged += HandleFieldChanged;
    }    
    

    Ce code permet également de lier un gestionnaire d’événements quand un champ est modifié. Dans le nouveau gestionnaire, vous pouvez vérifier si le modèle est valide et définir isError de manière appropriée.

        private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
        {
            isError = !editContext.Validate();
            StateHasChanged();
        }
    
  6. Étant donné que nous avons maintenant créé un gestionnaire d’événements, nous devons le supprimer quand le composant d’extraction n’en a plus besoin.

    public void Dispose()
    {
        editContext.OnFieldChanged -= HandleFieldChanged;
    }
    
  7. Pour implémenter la fonctionnalité Dispose, vous devez également l’indiquer à Blazor. Ajoutez ce code en haut de la page sous les instructions @inject.

    @implements IDisposable
    
  8. Supprimez toutes les références à isSubmitting et mettez à jour la méthode PlaceOrder.

    async Task PlaceOrder()
    {
      var response = await HttpClient.PostAsJsonAsync(NavigationManager.BaseUri + "orders", OrderState.Order);
      var newOrderId= await response.Content.ReadFromJsonAsync<int>();
      OrderState.ResetOrder();
      NavigationManager.NavigateTo($"myorders/{newOrderId}");
    }    
    
  9. Dans Visual Studio Code, appuyez sur F5 ou sélectionnez Exécuter>Démarrer le débogage.

    Image GIF animée montrant que le bouton Passer la commande est désactivé jusqu’à ce que tous les champs contiennent des valeurs correctes.

    Un client est maintenant invité à entrer des informations. Au début, le bouton Passer la commande est désactivé. Le bouton est activé uniquement une fois que tous les champs obligatoires contiennent des données.

  10. Appuyez sur Maj + F5 pour arrêter l’exécution de l’application.