Una delle lacune più noiose di Blazor, sino alla versione 6.0, era la mancanza di supporto per Dependency Injection nei custom validator, che fortunatamente è stata risolta in .NET 7.0. Cerchiamo di capire di cosa si tratta.
Immaginiamo di avere una classe Person, decorata con le data annotation per la validazione dei vari campi:
public class Person { [Required] public string Name { get; set; } [ValidAge] public int Age { get; set; } }
ValidAge è un custom validator, che possiamo creare semplicemente ereditando dalla classe ValidationAttribute ed effettuando l'override del metodo IsValid:
public class ValidAge : ValidationAttribute { protected override ValidationResult? IsValid(object? value, ValidationContext validationContext) { var service = validationContext.GetService<IAgeValidator>(); if (!service.IsValid((int)value!)) { return new ValidationResult("Age is invalid"); } return ValidationResult.Success; } }
Quella che possiamo vedere in alto è un'implementazione piuttosto comune: come possiamo notare, invece che inserire la logica di validazione direttamente nel custom attribute, stiamo sfruttando un servizio applicativo, così da migliorare la riusabilità del codice e la sua testabilità. Per recuperare l'istanza di IAgeValidator, abbiamo utilizzato il metodo GetService esposto dal ValidationContext, esattamente come avremmo fatto in una normale applicazione ASP.NET Core.
Tuttavia, fino a Blazor 6.0, questa tecnica non era supportata, e il metodo GetService restituiva sempre un valore null. Questo ovviamente rappresentava una grossa limitazione, soprattutto se volevamo creare degli attribute da utilizzare sia client side (su Blazor) che server side (su Web API).
In Blazor 7.0, invece, questa limitazione è stata superata, e tutto funziona come ci aspetteremmo.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire script pre e post esecuzione di un workflow di GitHub
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Creare un'applicazione React e configurare Tailwind CSS
Testare l'invio dei messaggi con Event Hubs Data Explorer
Usare lo spread operator con i collection initializer in C#
Creare alias per tipi generici e tuple in C#
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Limitare le richieste lato server con l'interactive routing di Blazor 8
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Miglioramenti nelle performance di Angular 16
I più letti di oggi
- Utilizzare angular-cli per creare una direttiva in #angular2 https://aspit.co/bft di @sm15455
- le impostazioni sono su #windowslive, quindi basta il liveid per avere tutte le ... http://aspitalia.com/build-win8 #BldWin
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- la nostra app per #win8 è nello store che vi aspetta da qualche mese: provatela! contenuti, forum e push! https://aspit.co/pd