Come sappiamo, già dalla sua prima versione, ASP.NET MVC mette a nostra disposizione l'Html Helper ActionLink, tramite il quale possiamo generare link ad altre pagine del nostro sito specificando i nomi delle relative action e controller. Si tratta di una pratica che, oltre che comoda, risulta estremamente versatile nel momento in cui dovessimo modificare le route dell'applicazione, dato che tutti i link verrebbero ricalcolati automaticamente in base alle nuove regole. Un esempio di utilizzo è quello seguente, che rimanda alla action "About" del controller "HomeController":
@this.Html.ActionLink("About...", "about", "home")
Un limite di ActionLink, però, è che la realizzazione di link il cui contenuto non sia semplice testo, ma coinvolga ad esempio degli ulteriori tag, risulta tutt'altro che agevole. Per superare questo problema, possiamo realizzare un helper personalizzato, che ci consenta di specificare in maniera più libera il contenuto desiderato. Il nostro helper, invece che restituire un elemento di tipo string, scrive i tag Html direttamente nello stream di output e restituisce un'istanza di un oggetto DisposableActionLink.
public static DisposableActionLink TemplateActionLink( this HtmlHelper helper, string actionName, string controllerName, object routeValues, object htmlAttributes) { string targetUrl = UrlHelper.GenerateUrl(null, actionName, controllerName, new RouteValueDictionary(routeValues), helper.RouteCollection, helper.ViewContext.RequestContext, true); var tagBuilder = new TagBuilder("a"); tagBuilder.Attributes.Add("href", targetUrl); tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); helper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag)); return new DisposableActionLink(helper.ViewContext); }
In particolare, l'Url di destinazione viene determinato grazie alla classe UrlHelper, mentre il vero e proprio tag Html è generato grazie a TagBuilder e mantenuto aperto. Eventualmente possiamo prevedere anche degli overload minimali, che consentano di utilizzare questo metodo senza dover necessariamente specificare tutti i parametri.
L'oggetto restituito non è altro che una classe che implementa IDisposable e che, all'esecuzione del metodo Dispose, si limita a scrivere sul medesimo stream di output il tag di chiusura:
public class DisposableActionLink : IDisposable { private TextWriter writer; public DisposableActionLink(ViewContext context) { this.writer = context.Writer; } public void Dispose() { this.writer.Write("</a>"); GC.SuppressFinalize(this); } }
Il vantaggio di questo approccio è che, a questo punto, possiamo generare dei link il cui contenuto sia totalmente personalizzabile, come nell'esempio seguente.
@using (this.Html.TemplateActionLink("about")) { <div> <img src="..." alt=".." /> Testo del link </div> }
Nonostante gli esempi di codice che abbiamo utilizzato siano basati sulla sintassi di Razor, questo metodo funziona con entrambi i ViewEngine previsti da ASP.NET MVC 3, ed è anche utilizzabile nelle versioni precedenti di questo framework. Attenzione però a non dimenticare di importare il namespace all'interno del quale è definito l'helper, pena un'eccezione a runtime.
@using MyHelperNamespace
<%@ Import namespace="MyHelperNamespace" %>
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire domini wildcard in Azure Container Apps
C# 12: Cosa c'è di nuovo e interessante
Miglioramenti agli screen reader e al contrasto in Angular
Verificare la provenienza di un commit tramite le GitHub Actions
Eseguire una GroupBy per entity in Entity Framework
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Creare gruppi di client per Event Grid MQTT
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Utilizzare un service principal per accedere a Azure Container Registry
Reactive form tipizzati con FormBuilder in Angular
Utilizzare le collection expression in C#
Gestire liste di tipi semplici con Entity Framework Core
I più letti di oggi
- C# 4
- Spaziatura tra i caratteri in Silverlight 5
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Segui in tempo reale il TechEd 2004
- da oggi è possibile fare login velocemente con LinkedIn e Google. a questi si aggiunge il supporto già attivo per Facebook, Twitter, Microsoft Account, Windows Hello e OpenID, per darvi sempre più possibilità di accedere semplicemente alla nostra community! #aspitalia
- Migrare una service connection a workload identity federation in Azure DevOps
- Evitare postback multipli in un UpdatePanel