ClientIDMode in ASP.NET 4.0

Finalmente, dopo ASP.NET MVC, anche con le ASP.NET WebForms è possibile avere maggior controllo sul markup generato, nello specifico il controllo degli ID per i controlli runat server che, precedentemente a questa release, subivano una trasformazione in base alla loro gerarchia nell’albero dei controlli della pagina.
Per esempio, in una semplice pagina in cui si abbia una Master Page con un ContentPlaceolder che continene una semplice label con un ID myLabel, si ottiene una trasformazione in NomeContentPlaceolderDellaMaster_mylabel.

La slide seguente chiarifica la situazione:

aspnet4ClientIDMode001

Ovviamente, in pagine parecchio complesse si possono avere nomi piuttosto lunghi e la loro non prevedibilità obbliga lo sviluppatore ad utilizzare degli scomodi workarounds per utilizzare del codice javascript che interagisca con questi controlli. Ovviamente questo tipo di problema vale anche per i fogli di stile (CSS) che non possono utilizzare gli ID ma devono per forza appoggiarsi all’attributo class del tag.

I due snippets seguenti mostrano i workarounds utilizzabili prima dell’uscita di ASP.NET 4.0.

#<%= myLabel.ClientID %>
{
    font-size: 100%;
}

<script type="text/javascript">
    function MyFunction()
    {
        alert(<%= myLabel.ClientID %>);
    }
</script>

Fortunatamente ora è disponibile un nuovo attributo - ClientIDMode - per tutti i controlli runat=”server”, che permette di cambiare il comportamente utilizzato dall’engine di rendering (per i soli ID) indipendentemente dalla gerarchia dei controlli contenuti nella pagina.

Nello specifico i comportamenti disponibili sono 4:

AutoID È il normale comportamente che si ha con le versioni precendenti ad ASP.NET 4.0.
Static Permette di forzare l’ID di output. Con questa opzione non avverrà nessuna trasformazione ed il valore sarà perfettamente identico a quello impostato nell’attributo ID.
Predictable Questo attributo viene utilizzato quando ci si trova in un contesto il cui il controllo contenitore è di tipo DataBoundControl, ossia quando si ha una generazione di più righe tipo in un GridView.
Inherit Indica che il CliendIDMode verrà eredito dal controllo padre.

Personalmente ritengo molto utile questa funzionalità introdotta nella nuova versione di ASP.NET, in quanto il controllo del markup è una necessità indispensabile quando si ha l’esigenza di sviluppare applicazioni web in cui il numero di interazioni client-side (javascript) con l’utente è alto.


Comments