Negli esempi precedenti abbiamo introdotto il componente QuickGrid, che ci permette di realizzare velocemente interfacce tabellari in Blazor. Un caso d'uso particolarmente comune è quello di voler modificare i dati contenuti dalla griglia in base a un'azione dell'utente, come per esempio filtrare per una particolare "Industry":
Per realizzare quest'interfaccia, come prima cosa dobbiamo creare la Select e caricarne gli elementi:
@inject MyContext data <p> Select industry: <select @onchange="@IndustrySelected"> @if (_industries == null) { <option>... loading ...</option> } else { <option value="0">(all)</option> @foreach (var industry in _industries) { <option value="@industry.Id">@industry.Name</option> } } </select></p> <QuickGrid Items="data.Shares...."> ... </QuickGrid>
La Select in alto è in binding con una collection di _industries e aggiunge, come elemento iniziale, un option speciale con Value=0, che sfrutteremo per eliminare completamente il filtro.
Come effettuiamo il caricamento di _industries dal database? Una prima ipotesi potrebbe essere quella di sfruttare il metodo OnInitializedAsync:
private List<Industry>? _industries; private int selectedIndustryId; protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); _industries = await data.Industries.ToListAsync(); }
Se proviamo a eseguire questo codice, tuttavia, ci imbatteremo in un errore inaspettato:
La ragione è che sia QuickGrid che la nostra pagina provano a usare in maniera concorrente lo stesso DbContext di Entity Framework. Come sappiamo, un DbContext non è thread safe. Questo genera un'eccezione a runtime per metterci in guardia dal nostro errore.
Purtroppo non possiamo controllare esattamente quando la griglia esegue il suo refresh, e pertanto l'unica soluzione è quella di effettuare il caricamento tanto della select che della griglia stessa in un posto centralizzato:
<QuickGrid Items="LoadData()" ...> .. </QuickGrid> @code { private void IndustrySelected(ChangeEventArgs e) { selectedIndustryId = int.Parse(e.Value.ToString()); } private IQueryable<Share> LoadData() { if (_industries == null) { _industries = data.Industries.ToList(); this.StateHasChanged(); } if (selectedIndustryId == 0) { return data.Shares.Include(x => x.Industry); } else { return data.Shares.Include(x => x.Industry).Where(x => x.Industry.Id == selectedIndustryId); } } }
Nel codice in alto, abbiamo modificato la proprietà Items di QuickGrid che ora, invece che accedere al DbContext direttamente, invoca invece un metodo LoadData. All'interno di questo metodo, come prima cosa verifichiamo se le _industries siano già state caricate e successivamente restituiamo un opportuno IQueryable, che conterrà un filtro preimpostato o meno a seconda della selezione dell'utente.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Usare una container image come runner di GitHub Actions
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Evitare il flickering dei componenti nel prerender di Blazor 8
Implementare l'infinite scroll con QuickGrid in Blazor Server
Migliorare l'organizzazione delle risorse con Azure Policy
Testare l'invio dei messaggi con Event Hubs Data Explorer
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Change tracking e composition in Entity Framework
Eseguire operazioni sui blob con Azure Storage Actions
Minimal API in ASP.NET Core 8
Generare velocemente pagine CRUD in Blazor con QuickGrid
I più letti di oggi
- Creare un array al volo
- Creare un motore di ricerca con Google e ASP.NET
- i nostri contenuti vanno in pausa fino a settembre. buona estate a tutti!
- con i #websocket i client e il server comunicano in tempo reale, quindi si possono ... http://aspitalia.com/build-win8 #BldWin
- Tutorial .NET Framework
- Welcome back to .NET https://aspit.co/b9j
- Debug di app .NET tramite snapshot con Application Insight
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare la parola chiave var con lambda eExpression e method group in C# 10 https://aspit.co/cb3 di @sm15455
- Immagini vettoriali in SVG con HTML5