Il sistema di data binding di Blazor è incredibilmente potente e versatile. Grazie a esso, possiamo non solo collegare componenti visuali a proprietà della pagina, ma anche eseguire una semplice logica quando il valore di una delle proprietà venga modificato.
Per esempio possiamo facilmente creare una somma di due numeri sfruttando un'opportuna proprietà:
<h1>Sum</h1> <input type="text" @bind="@first" @bind:event="oninput" /> + <input type="text" @bind="@second" @bind:event="oninput" /> = <span>@Sum</span> @code { private int? first = 0; private int? second = 0; private int Sum { get { return first.GetValueOrDefault() + second.GetValueOrDefault(); } } }
In questo caso, i due text input sono in binding con due field, first e second, mentre la somma è calcolata tramite una proprietà readonly Sum. Se configuriamo il binding come nell'esempio, vedremo il valore della somma aggiornarsi in real time mentre digitiamo l'input. Il motore di rendering, infatti, si accorgerà che anche il contenuto dello Span è cambiato e pertanto aggiornerà il corrispondente elemento in pagina.
Questo sistema, tuttavia, presenta un grosso limite: non possiamo eseguire operazioni asincrone. Le proprietà infatti sono sincrone e non supportano il pattern async/await.
Immaginiamo per esempio di avere una pagina di settings, e di voler salvare il contenuto automaticamente ogni volta che una proprietà viene modificata. Questa operazione richiederà una chiamata ad API, per sua natura asincrona. Come possiamo procedere?
La soluzione è quella di impostare un callback sull'after binding:
<PageTitle>Options</PageTitle> <h1>Option</h1> <p>Option 1: <input type="text" @bind="@opt1" @bind:after="SaveSettingsAsync" /></p> <p>Option 2: <input type="checkbox" @bind="@opt2" @bind:after="SaveSettingsAsync" /></p> <p>@message</p> @code { private string opt1 = string.Empty; private bool opt2 = true; private string message = string.Empty; private async Task SaveSettingsAsync() { message = $"Save in progress..."; // simula una chiamata ad API await Task.Delay(2000); message = $"Saved {opt1} and {opt2}"; } }
In questo caso, abbiamo un metodo SaveSettingsAsync, che simula la chiamata ad API e poi mostra un messaggio di salvataggio ottenuto. Tutto ciò che dobbiamo fare è impostarlo tramite l'attributo bind:after in corrispondenza dei controlli in data binding, così che venga chiamato automaticamente dopo che il binding abbia impostato il nuovo valore. Il motore di rendering, come nel caso di ogni esecuzione asincrona, effettuerà due refresh del markup, uno fino al primo await, mostrando il messaggio "Save in progress", e uno al termine, confermando il completamento dell'operazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare gruppi di client per Event Grid MQTT
Gestire il colore CSS con HWB
.NET Conference Italia 2024
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Eseguire operazioni sui blob con Azure Storage Actions
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Aggiungere interattività lato server in Blazor 8
Usare lo spread operator con i collection initializer in C#
Filtering sulle colonne in una QuickGrid di Blazor
Gestire gli accessi con Token su Azure Container Registry
Creare una libreria CSS universale: Cards
I più letti di oggi
- Simulare Azure Cosmos DB in locale con Docker
- Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
- .NET Conference Italia 2023 - Milano e Online
- .NET Conference Italia 2024 - Milano
- Configurare lo startup di applicazioni server e client con .NET Aspire
- MS03-45: risolti i problemi della patch 824141
- Utilizzare Container Queries nominali