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
Usare un KeyedService di default in ASP.NET Core 8
Filtering sulle colonne in una QuickGrid di Blazor
Recuperare l'ultima versione di una release di GitHub
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Referenziare un @layer più alto in CSS
Utilizzare Tailwind CSS all'interno di React: primi componenti
Utilizzare database e servizi con gli add-on di Container App
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Eseguire i worklow di GitHub su runner potenziati
Generare la software bill of material (SBOM) in GitHub
Utilizzare i primary constructor di C# per inizializzare le proprietà
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core