Il meccanismo degli helper è stato concepito per garantire elevate possiblità di personalizzazione ed estensione, come tutti i componenti di ASP.NET MVC. Si possono quindi aggiungere funzionalità al framework scrivendo e utilizzando helper personalizzati.
Questa operazione si rivela particolarmente efficace per generare codice HTML in modo dinamico, sulla base dei parametri passati alla funzione helper. La dinamicità è infatti l'elemento che distingue gli helper da un sistema apparentemente simile, le viste parziali. Entrambi i meccanismi ci permettono di evitare la ripetizione di codice HTML nelle nostre viste ma, almeno in linea generale, mentre le viste parziali ospitano un insieme statico di tag HTML, con gli helper siamo in grado di personalizzare il risultato.
Per aggiungere nuovi helper a quelli in dotazione a MVC, utilizziamo un'interessante funzionalità delframework .NET: gli extension methods. Tramite gli extension methods siamo infatti in grado di aggiungere nuovi metodi ad una classe senza dover tuttavia creare classi derivate o modificare quella esistente.
I nuovi metodi devono essere statici e definiti seguendo una sintassi particolare. Gli extension methods sono così flessibili che anche gli sviluppatori di ASP.Net MVC li hanno scelti per lo sviluppo degli helper inclusi nel framework.
Vediamo quindi come creare un semplice helper Html che mostri una lista non ordinata di elementi. Gli elementi da visualizzare saranno passati come parametro alla funzione.
Per creare nuovi helper dobbiamo innanzitutto creare una nuova classe statica in cui inserire i metodi:
namespace ImageGallery.Helpers { public static class HtmlHelpers { } }
Aggiungiamo quindi un nuovo extension method chiamato UnorderedList
:
public static string UnorderedList(this HtmlHelper helper, params string[] items) { if (items.Length <= 0) return string.Empty; StringBuilder b = new StringBuilder(); b.AppendLine("<ul>"); foreach (string item in items) { b.AppendLine(string.Format("<li>{0}</li>", item)); } b.AppendLine("</ul>"); return b.ToString(); }
Il metodo accetta come argomenti gli elementi della lista, che viene costruita utilizzando un oggetto StringBuilder
. Il codice HTML così generato viene restituito dalla funzione in modo da essere aggiunto nella pagina. È possibile utilizzare il metodo all'interno delle nostre viste in questo modo:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <%@ Import Namespace="ImageGallery.Helpers" %> <asp:Content ContentPlaceHolderID="MainContent" runat="server"> <%= Html.UnorderedList("Elemento 1", "Elemento 2", "Elemento 3") %> </asp:Content>
È necessario includere il namespace ImageGallery.Helpers
con la nostra classe, all'interno della vista. Senza questa operazione .NET non sarebbe in grado di trovare l'extension method appena creato. Per evitare
di includere manualmente il namespace in ogni vista è possibile agire sul file web.config
in modo da rendere automatica l'inclusione.
Ed ecco il risultato:
<ul> <li>Elemento 1</li> <li>Elemento 2</li> <li>Elemento 3</li> </ul>
Non possiamo trattare qui le vaste possibilità offerte dalla scrittura di helper personalizzati, ma è utile scaricare il sorgente del framework ASP.Net MVC, ed esaminare il codice degli helper inclusi nel framework per capirne il funzionamento. Sul sito ufficiale sono troviamo anche alcuni tutorial per la scrittura di helper personalizzati.