Nello script precedente (https://www.aspitalia.com/script/1390/Creare-Link-Fortemente-Tipizzati-Blazor.aspx) abbiamo visto come replicare in Blazor una peculiarità già esistente in ASP.NET Core, ossia la generazione degli URL in maniera fortemente tipizzata: il beneficio è ovviamente quello di limitare al massimo l'utilizzo di stringhe, realizzando un link specificando il tipo del componente che vogliamo visualizzare, e lasciando al nostro oggetto l'incombenza di determinare l'URL in base a quanto impostato sul componente stesso.
Un limite che dobbiamo ora colmare è quello di supportare URL con parametri. Immaginiamo per esempio, che il classico Counter del template di Blazor ammetta un URL di questo tipo, con cui specificare il valore di partenza:
@page "/contatore/{start:int}" <h1>Counter</h1> <p>Current count: @Start</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { [Parameter] public int Start { get; set; } private void IncrementCount() { this.Start++; } }
Per gestire questa casistica, possiamo aggiungere un overload del metodo GetUrl che possiamo invocare passando un anonymous object:
<li class="nav-item px-3"> <NavLink class="nav-link" href="@(RouteHelper.GetUrl<Counter>(new { Start = 4 }))"> <span class="oi oi-plus" aria-hidden="true"></span> Counter </NavLink> </li>
Questo secondo overload, può essere realizzato sfruttando la classe RouteValueDictionary del package Microsoft.AspNetCore.Routing.Abstractions:
public static string GetUrl<TComponent>(object parameters) where TComponent : ComponentBase { var properties = new RouteValueDictionary(parameters); string url = GetUrl<TComponent>(); foreach (var key in properties.Keys) { url = Regex.Replace(url, $"{{{key}(:.+?)?}}", properties[key].ToString(), RegexOptions.IgnoreCase); } return url; }
Questa classe, infatti, può essere inizializzata passando un object, ma funziona come un dictionary, popolando automaticamente le sue coppie chiave-valore con le proprietà dell'oggetto in input.
A questo punto possiamo sfruttare le regular expression per sostituire i token dell'URL. La regex che utilizziamo è la seguente, per esempio una volta sostituito il nome della proprietà "start":
{start(:.+?)?}
Questo pattern, per i meno avvezzi al linguaggio delle regex, si legge in questa maniera:
- inizia con una parentesi graffa aperta {;
- ha il testo "start", che rappresenta il nome del nostro parametro;
- segue un gruppo, tra parentesi tonde, che contiene un carattere ":", seguito da un numero arbitrario di caratteri. Questo gruppo rappresenta il tipo del parametro;
- dato che il tipo è opzionale, il ? al termine della parentesi indica che possa esistere o meno;
- il pattern termina con una parentesi graffa chiusa.
Nel prossimo script vedremo come colmare l'ultima lacuna del nostro codice, ossia gestire URL multipli sulle pagine per supportare parametri opzionali.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire la cancellazione di una richiesta in streaming da Blazor
Filtering sulle colonne in una QuickGrid di Blazor
Ottenere un token di accesso per una GitHub App
Migrare una service connection a workload identity federation in Azure DevOps
Configurare lo startup di applicazioni server e client con .NET Aspire
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Path addizionali per gli asset in ASP.NET Core MVC
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Hosting di componenti WebAssembly in un'applicazione Blazor static
Implementare l'infinite scroll con QuickGrid in Blazor Server
Gestire gli accessi con Token su Azure Container Registry
I più letti di oggi
- Tutorial Entity Framework 6
- Tutorial Entity Framework
- Tutorial HTML5
- RT @aspitalia Partecipa al nostro evento #RCD4, fai un RT e sarai estratto per 1 copia di #sl3guidacompleta! http://u.aspitalia.com/bw
- Migliorare l'organizzazione delle risorse con Azure Policy
- Configurare più site su unico web role di Windows Azure
- Windows Phone 8 Developer Day - Milano
- ReBuild 2020 Live - Online
- ASPItalia.com Network: si aggiungono LINQItalia.com e SilverlightItalia.com
- Rilasciata la versione 1.0 di ASP.NET MVC