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
Le novità di Angular: i miglioramenti alla CLI
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Creare un webhook in Azure DevOps
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Sfruttare lo streaming di una chiamata Http da Blazor
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Accesso sicuro ai secrets attraverso i file in Azure Container Apps
Eseguire attività basate su eventi con Azure Container Jobs
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
Configurare policy CORS in Azure Container Apps
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8