Nello scorso script, abbiamo iniziato a illustrare le novità del motore di rendering di Blazor 8, occupandoci del supporto a pagine statiche e, in particolare, allo stream rendering.
Pur essendo una funzionalità molto interessante, si tratta comunque di una modalità riservata esclusivamente (come già detto) a pagine statiche, in cui l'utente non ha possibilità di interagire con nessun componente.
Per dimostrare questa cosa, immaginiamo di realizzare un componente Counter.razor simile a quello del template di default di Blazor:
<p role="status">Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
A questo punto, possiamo aggiungerlo alla nostra pagina statica di WeatherForecast con il supporto a Stream rendering:
@page "/weather" @attribute [StreamRendering] <PageTitle>Weather</PageTitle> <h1>Weather</h1> <p>This component demonstrates showing data.</p> <Counter></Counter> ...
Se proviamo a visualizzare la pagina, essa avrà esattamente il comportamento che ci aspettiamo: il caricamento sarà asincrono, come abbiamo introdotto nello scorso script, e in testa alla pagina sarà presente il nostro button per il contatore:
Tuttavia, come possiamo facilmente verificare, clickando sul pulsante non avremo nessun effetto: la pagina è statica, così come il componente Counter, e pertanto l'evento OnClick non verrà mai scatenato.
La grossa novità di Blazor 8, però, è che possiamo controllare a livello di singolo componente (con alcune limitazioni), come questo deve essere renderizzato. Per esempio, possiamo attivare la funzionalità di Server Interactivity registrando i corrispondenti servizi in program.cs:
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); var app = builder.Build(); // .. altro codice qui .. app.MapRazorComponents<App>() .AddInteractiveServerRenderMode(); app.Run();
A questo punto, non dobbiamo far altro che specificare la modalità di rendering quando istanziamo il componente:
@page "/weather" @attribute [StreamRendering] <PageTitle>Weather</PageTitle> <h1>Weather</h1> <p>This component demonstrates showing data.</p> <Counter @rendermode="InteractiveServer"></Counter> .. altro codice qui ..
Come possiamo notare, abbiamo specificato che vogliamo utilizzare InteractiveServer come RenderMode per il nostro Counter.
A questo punto, se ricarichiamo la pagina, il componente funzionerà esattamente come previsto: ciò è possibile perché, dietro le quinte, Blazor aprirà un canale WebSocket con il server tramite cui garantire l'interattività, analogamente al "vecchio" Blazor Server.
Alternativamente, possiamo specificare la modalità di rendering direttamente nella definizione del componente Counter, e il comportamento sarà esattamente il medesimo:
@rendermode InteractiveServer <p role="status">Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Un simile ragionamento si può utilizzare anche per WASM, anche se in questo caso saranno necessari dei piccoli accorgimenti: ce ne occuperemo in un prossimo script.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Estrarre dati randomici da una lista di oggetti in C#
Sostituire la GitHub Action di login su private registry
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Disabilitare automaticamente un workflow di GitHub
Hosting di componenti WebAssembly in un'applicazione Blazor static
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Eseguire operazioni sui blob con Azure Storage Actions
Definire stili a livello di libreria in Angular
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
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