Il tag asp:ImageButton fa fallire la validazione XHTML


Asp.net produce tag xhtml validi, però l'ImageButton crea un errore per il W3C Validator. Vediamo un facile workaround. A differenza del vecchio asp o del php, asp.net ha un modello di sviluppo delle pagine più slegato dall'html. La filosofia di questo modello ha le fondamenta nell'obiettivo di permettere anche agli sviluppatori windows di realizzare applicazioni web, senza avere molta conoscenza delle problematiche di un sito. Ovviamente, per fare un lavoro di qualità, occorre conoscere approfonditamente html e css.

Dal .net 1.0 Microsoft ha introdotto gli webcontrol. Sono dei tag propri, in cui il nome del tag ha anteposto un namespace asp:. Questi tag vengono processati lato server e, a seconda dello user-agent che ha richiesto la pagina, possono essere convertiti nell'html che permetta su quel determinato browser una visualizzazione più efficiente.

Dal .net 2.0 di Microsoft produce durante il rendering tag XHTML validi.

Se nella pagina è presente un tag asp:ImageButton avviene un comportamento molto strano. Se guardate l'origine della pagina sul browser è tutto codice XHTML valido. Se però si va sul W3C Validator e si mette l'indirizzo della stessa pagina (l'indirizzo, non il codice che abbiamo preso dall'origine) viene fuori un bell'errore.

Dal cappello che ho fatto a questo post si può capire il motivo di questa anomalia.

Il renderer di asp.net produce XHTML valido se il browser è moderno, tipo Explorer, Chrome, Firefox o Mozilla, mentre se vede lo user-agent del W3C Validator, produce degli errori. Questo perchè con tutta probabilità il renderer non riconosce quello user-agent e quindi decide di adottare una versione di html più vecchia, la HTML 4.0 Transitional, che è sicuramente visualizzabile dai browser più vecchi, che potrebbero non digerire una novità come l'XHTML.

Quindi se noi siamo di quelli a cui piace mettere sulle nostre pagine il tastino del W3C, che invita a vedere quanto siamo bravi validando il nostro XHTML, faremmo una figura barbina, perchè il validatore riporta un errore che invece non c'è.

A questo punto occorre trovare un workaround. In effetti ci sono due alternative.

La prima è inserire, nella direttiva page delle pagine che contengono l'asp:ImageButton, l'attributo ClientTarget="uplevel" che forza la generazione dei secondo un DOM più sofisticato.

La seconda, che mi piace di più, permette di prendere il toro per le corna e risolvere il problema all'origine. Occorre inserire il seguente codice nel web.config, all'interno del tag system.web

    <browserCaps>
      <case match="W3C_Validator*">
        TagWriter = System.Web.UI.HtmlTextWriter
        W3CDomVersion = 1.0
      </case>
    </browserCaps>

Questo codice permette di dire al renderer delle pagine di riconoscere lo user-agent del W3C Validator e, solo per lui, forzare la generazione di codice XHTML valido. Indipendentemente da quello che abbiamo messo in pagina. Con qualsiasi evoluzione che ci faremo, non saremo costretti ad andare ogni volta e riverificare la validazione dell'html. Ovviamente a meno che non modifichiamo noi l'html e ci introduciamo noi degli errori. Al solito il bug più grosso è l'essere umano. :-)

Dato un numero sufficiente di occhi, tutti i bug vengono a galla. (Eric Steven Raymond)

Post correlati: