Övning – Lägga till dataverifiering på serversidan och klientsidan i adressformuläret
Blazor kan binda formulär till modeller i ditt program. Om du dekorerar dessa modeller med dataanteckningar kan du få valideringar på klient- och serversidan utan att skriva mer kod.
Appen lägger inte order korrekt när en klient inte anger ett namn och några adressfält. Teamet vill att du förbättrar valideringarna så att fler av fälten inkluderas. De vill också ha några minsta längder och teckenvalidering.
I den här övningen ersätter du den aktuella verifieringen på serversidan för att använda dataanteckningar. Sedan ser du hur du hanterar valideringsmeddelanden och förbättrar det färdiga valideringsstödet. I det sista steget styr du hur formuläret skickas och skickar bara ett formulär när alla fält är giltiga.
Lägga till dataanteckningar i en Blazor-modell
I Visual Studio Code går du till utforskaren och expanderar Modell och väljer sedan Address.cs.
Lägg till en referens överst
System.ComponentModel.DataAnnotationsi klassen.using System.ComponentModel.DataAnnotations;Lägg till en dataanteckning för varje obligatoriskt fält.
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; } }I utforskaren expanderar du Sidor och väljer sedan Checkout.razor.
Lägg till valideringssammanfattningen och valideringsanteckningen ovanför den avslutande
</EditForm>taggen.<ValidationSummary /> <DataAnnotationsValidator /> </EditForm> </div>I taggen EditForm ersätter du parametern
OnSubmitför att använda den giltiga sändningen.<EditForm Model=Order.DeliveryAddress OnValidSubmit=PlaceOrder>Nu kan du ta bort den anpassade logiken på serversidan för att testa om adressen är giltig.
CheckSubmissionTa bort metoden i@codeblocket.
Testa validering av nya dataanteckningar
Tryck på F5
Försök att beställa några pizzor utan att ange någon information, sedan med ofullständig information. Observera de detaljerade felmeddelandena för varje fält.
Den här interaktionen förbättrar felkontrollerna för varje fält, men felet för varje fält skulle vara bättre bredvid det fält som det relaterar till.
Tryck på Skift + F5 för att stoppa appen från att köras.
Förbättra EditFrom-felmeddelanden
I utforskaren expanderar du Sidor och väljer sedan Checkout.razor.
Ta bort Blazor-komponenten
<ValidationSummary />.<DataAnnotationsValidator /> </EditForm> </div>I utforskaren expanderar du Delat och väljer sedan AddressEditor.razor.
Lägg till ett anpassat valideringsmeddelande under varje fält.
<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>I utforskaren expanderar du Modell och väljer sedan Address.cs.
Lägg till ett anpassat felmeddelande för varje fälts dataanteckning.
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; } }
Testa validering av nya dataanteckningar
Tryck på F5
Adressformuläret visar dynamiskt felmeddelande under ett fält som har ogiltiga data. Den här interaktionen sker på klientsidan och förhindrar att kunder anger felaktiga adresser.
Tryck på Skift + F5 för att stoppa appen från att köras.
Återställ det övergripande felmeddelandet och inaktivera skicka-knappen
I utforskaren expanderar du Sidor och väljer sedan Checkout.razor.
Lägg till en
OnInvalidSubmitparameter som anropar enShowErrormetod för komponentenEditForm.<EditForm Model=Order.DeliveryAddress OnValidSubmit=PlaceOrder OnInvalidSubmit=ShowError>Lägg till en ShowError-metod som uppdaterar egenskapen
isError.protected void ShowError() { isError = true; }PlaceOrderÄndra metoden för att uppdateraisErroregenskaperna ochisSubmitting.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}"); }Tryck på F5
Felmeddelandet visas om kunden försöker skicka ett ogiltigt formulär.
Tryck på Skift + F5 för att stoppa appen från att köras.
Aktivera skicka-knappen när alla fält är korrekta
Skulle en bättre användarupplevelse vara att en kund inte kan skicka sin beställning förrän de har slutfört alla fält? Nu ska vi ändra utcheckningssidan så att den stöder det här kravet.
EditForm Ändra till att använda en EditContext i stället för en modell.
I utforskaren expanderar du Sidor och väljer sedan Checkout.razor.
Uppdatera
EditFormelement.<EditForm EditContext=editContext OnValidSubmit=PlaceOrder>Ändra knappelementet så att parametern
isErroranvänds.<button class="checkout-button btn btn-warning" type="Submit" disabled=@isError>I blocket
@codelägger du till en deklaration för den nyaEditContext.private EditContext editContext;Initiera kontexten med orderleveransadressen.
protected override void OnInitialized() { editContext = new(Order.DeliveryAddress); editContext.OnFieldChanged += HandleFieldChanged; }Den här koden gör det också möjligt att länka en händelsehanterare till när ett fält ändras. I den nya hanteraren kan du kontrollera om modellen är giltig och ange den
isErrorpå rätt sätt.private void HandleFieldChanged(object sender, FieldChangedEventArgs e) { isError = !editContext.Validate(); StateHasChanged(); }Nu när vi har skapat en händelsehanterare bör vi ta bort den när utcheckningskomponenten inte längre behöver den.
public void Dispose() { editContext.OnFieldChanged -= HandleFieldChanged; }För att implementera
Disposefunktionen måste du också meddela Blazor. Lägg till den här koden överst på sidan under instruktionerna@inject.@implements IDisposableTa bort alla referenser till
isSubmittingoch uppdateraPlaceOrdermetoden.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}"); }Tryck på F5
En kund uppmanas nu att ange information och att börja med knappen Förbeställning är inaktiverad. Först när alla obligatoriska fält har data blir knappen klickbar.
Tryck på Skift + F5 för att stoppa appen från att köras.