ASP.NET e XHTML

Aggiornamento: novembre 2007

ASP.NET consente di creare pagine Web conformi agli standard XHTML. L'XHTML è uno standard del World Wide Web Consortium (W3C) che riformula l'HTML come documento XML. La creazione di pagine Web conformi agli standard XHTML presenta diversi vantaggi:

  • Garantisce che gli elementi delle pagine abbiano un formato corretto.

  • Poiché molti browser tendono sempre di più a supportare l'XHTML, la creazione di pagine conformi agli standard XHTML assicura che il rendering delle pagine sia coerente in tutti i browser.

  • L'utilizzo di XHTML consente di rendere le pagine conformi agli standard di accessibilità in modo più rapido.

  • L'XHTML è estendibile in quanto consente la definizione di nuovi elementi.

  • Una pagina XHTML è molto più facile da leggere a livello di codice nelle situazioni in cui la pagina Web viene elaborata da un computer anziché letta da utenti e il documento può essere modificato attraverso trasformazioni.

Il W3C ha identificato diversi livelli di conformità XHTML: XHTML 1.0 Transitional, XHTML 1.0 Frameset, XHTML 1.0 Strict e XHTML 1.1. La specifica XHTML 1.1 è la più rigorosa tra questi livelli. Le specifiche XHTML 1.0 Frameset e Transitional definiscono il codice HTML basato su XML, ma supportano determinati costrutti di uso comune. Molte pagine Web esistenti possono essere rese conformi alle specifiche XHTML 1.0 Frameset o Transitional ma non possono soddisfare le specifiche XHTML 1.0 Strict o XHTML 1.1 senza richiedere una revisione sostanziale allo scopo di sostituire la funzionalità implementata utilizzando costrutti non consentiti dalle specifiche.

Per ulteriori informazioni sullo standard XHTML, vedere la specifica XHTML 1.0 seconda edizione nel sito Web W3C (informazioni in lingua inglese).

Caratteristiche ASP.NET di conformità XHTML

L'XHTML definisce elementi e attributi in modo più restrittivo rispetto all'HTML. Per impostazione predefinita, tutto il codice generato da ASP.NET e tutti i controlli server Web inclusi in ASP.NET sono ora conformi allo standard XHTML 1.0 Transitional. In molti casi, il codice prodotto da ASP.NET è conforme anche agli standard XHTML 1.1. Se non diversamente specificato, i riferimenti allo standard XHTML contenuti in questo argomento sono validi sia per XHTML 1.0 che per XHTML 1.1.

Tra le regole XHTML che differiscono dall'HTML sono incluse le seguenti:

  • Tutti gli elementi prevedono un tag esplicito di chiusura o sono a chiusura automatica (con />).

  • Il rendering dei nomi di tag e attributi viene eseguito in minuscolo e i valori degli attributi sono racchiusi tra virgolette doppie. Ad esempio, se nella pagina viene utilizzato un controllo GridView, durante il rendering della pagina stessa il controllo GridView genererà HTML conforme agli standard XHTML. Tutti gli elementi generati utilizzano tag espliciti di apertura e chiusura (o tag a chiusura automatica) e i valori degli attributi sono racchiusi tra virgolette doppie.

  • Il rendering delle informazioni di formattazione è eseguito utilizzando solamente fogli di stile CSS. Per supportare questo standard, se la pagina include un elemento DOCTYPE XHTML, i controlli ASP.NET non eseguono il rendering di elementi o attributi font, come bgcolor, che non risulterebbero conformi agli standard XHTML.

  • In ASP.NET, se i controlli generano ID, come accade in Repeater, GridView e altri controlli, il formato degli ID è conforme alle indicazioni della specifica XHTML 1.0 Transitional.

  • ASP.NET aggiunge in modo dinamico un attributo action all'elemento form. Per impostazione predefinita, gli elementi form includono un attributo name, consentito dalla specifica XHTML 1.0 Transitional. Ciò consente di mantenere la compatibilità con le applicazioni esistenti che si basano sullo script client che fa riferimento agli elementi form mediante il relativo nome.

    Nota:

    L'attributo name dell'elemento form non è consentito dalle indicazioni della specifica XHTML 1.1. È possibile configurare l'applicazione in modo che non esegua il rendering di un attributo name. Per informazioni dettagliate, vedere la sezione "Controllo del rendering XHTML di pagine e controlli ASP.NET" più avanti in questo argomento.

  • Poiché l'XHTML richiede che tutti gli elementi siano racchiusi in un elemento contenitore, il rendering dei controlli ASP.NET, quali gli elementi input, viene eseguito in elementi div. Questo si verifica anche nel caso del rendering del codice HTML per controlli quali TextBox, CheckBox e RadioButton, nonché nel caso di campi nascosti, come l'elemento utilizzato per memorizzare i dati in stato di visualizzazione.

  • ASP.NET codifica i caratteri, come & (ad esempio &). Questo include anche gli URL generati come riferimento ECMAScript e i contenuti del valori codificati, come stato visualizzazione.

  • Tutti gli elementi script di cui viene eseguito il rendering nella pagina utilizzano l'attributo type appropriato (ad esempio, type="type/javascript") e non includono un attributo language. Questa condizione si riferisce agli script generati dalla pagina o ai controlli che richiedono script client per eseguire un postback, quali i controlli HyperLink, LinkButton, Calendar e TreeView, nonché i controlli di convalida, e dai metodi RegisterHiddenField, RegisterStartupScript e RegisterClientScriptBlock. I blocchi di script generati non vengono modificati automaticamente con un attributo type.

  • In ASP.NET il rendering dei blocchi di script viene eseguito all'interno di un commento XML (HTML).

Controllo del rendering XHTML di pagine e controlli ASP.NET

In alcune circostanze è possibile che si desideri utilizzare i controlli ASP.NET per eseguire il rendering del codice nel formato più rigoroso indicato dalla specifica XHTML 1.1. Il rendering predefinito include codice non conforme alla specifica XHTML 1.1. Gli standard XHTML 1.1 non consentono, ad esempio, l'utilizzo di un attributo name in un elemento form HTML.

Per contro, è possibile che si desideri utilizzare ASP.NET per eseguire il rendering di codice non conforme alle specifiche XHTML 1.0 Transitional. Ciò si verifica, in particolare, quando le pagine esistenti si basano su tag o attributi che erano supportati nelle versioni precedenti di ASP.NET ma che non sono conformi agli standard XHTML.

È possibile configurare il sito Web in modo da eseguire il rendering del codice secondo tre diverse modalità:

  • Modalità preesistente (simile alla modalità di rendering del codice nelle versioni precedenti di ASP.NET)

  • Modalità di transizione (XHTML 1.0 Transitional)

  • Modalità rigorosa (XHTML 1.0 Strict)

Per ulteriori informazioni, vedere Procedura: configurare il rendering di XHTML nei siti Web ASP.NET.

Nota:

L'opzione per il rendering del codice preesistente è fornita principalmente per facilitare la migrazione delle pagine già esistenti alla versione attuale di ASP.NET e potrebbe non essere supportata nelle versioni successive di ASP.NET.

Rendering preesistente

Quando il rendering è impostato sulla modalità preesistente, le pagine e i controlli ASP.NET modificano il proprio rendering perché segua il comportamento delle versioni precedenti di ASP.NET. Di seguito vengono riportati alcuni esempi di tali modifiche.

  • Il rendering dell'elemento form viene eseguito con un attributo name.

  • ASP.NET non esegue in modo automatico il rendering di un elemento div contenuto in un elemento form rappresentandolo come contenitore di controlli.

  • Il rendering dei controlli di convalida viene eseguito come elementi span con attributi personalizzati, quali controltovalidate.

  • L'elemento img non esegue il rendering degli attributi alt e src se questi non vengono inclusi in modo esplicito.

  • Se è necessario supportare il comportamento di postback automatico, i controlli eseguiranno il rendering di un attributo language (ad esempio, language="javascript").

  • L'attributo nowrap è previsto nei controlli che eseguono il rendering di un elemento div, come, ad esempio, il controllo Panel, se la proprietà Wrap del controllo è impostata su false.

  • I controlli ImageButton eseguono il rendering di un attributo border.

  • Il rendering di tutti gli elementi br presenti nella pagina viene eseguito come <br>. Tuttavia, se si include esplicitamente un tag <br />, la pagina ne eseguirà il rendering nello stato in cui si trova.

  • I controlli DataGrid e Calendar includono un attributo bordercolor negli elementi table di cui viene eseguito il rendering se viene impostata la relativa proprietà BackColor.

Definizione dell'elemento DOCTYPE e dello spazio dei nomi XHTML

Le pagine Web XHTML valide devono contenere una dichiarazione DOCTYPE che identifica la pagina come una pagina XHTML e fa riferimento al relativo schema XHTML di conformità. Nella pagina devono inoltre essere inclusi gli attributi del tag HTML che fa riferimento allo spazio dei nomi XHTML. ASP.NET non genera automaticamente una dichiarazione DOCTYPE quando viene eseguito il rendering della pagina. È necessario pertanto creare la dichiarazione DOCTYPE con i riferimenti appropriati allo spazio dei nomi XML.

Nota:

Nelle finestre di progettazione visiva, ad esempio Visual Studio, in genere sono inclusi modelli di pagina predefiniti contenenti una dichiarazione DOCTYPE. Se si utilizza una finestra di questo tipo, verificare che vengano create nuove pagine con la dichiarazione DOCTYPE richiesta.

Gli esempi di codice seguenti mostrano una dichiarazione DOCTYPE che è possibile aggiungere alle pagine.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >

Se la dichiarazione DOCTYPE non viene generata automaticamente, ASP.NET mantiene una maggiore flessibilità di rendering per i browser che presentano livelli differenti di conformità a seconda dei diversi standard HTML che è possibile specificare in una dichiarazione DOCTYPE.

Nota:

Se la dichiarazione DOCTYPE viene rimossa, la conformità XHTML non sarà soddisfatta. La pagina non verrà considerata come pagina XHTML e non farà riferimento allo schema XHTML.

Molti browser modificano anche il proprio rendering in base alla presenza o meno della dichiarazione DOCTYPE e di una dichiarazione dello spazio dei nomi XML. Se tali elementi sono presenti, i browser generalmente utilizzano un rendering basato sugli standard. Quando invece sono assenti, molti browser eseguono il rendering utilizzando regole specifiche che variano a seconda del tipo di browser (secondo una modalità talvolta definita "quirks mode") e possono pertanto generare risultati imprevedibili.

In modo analogo, è possibile controllare il tipo MIME della pagina. Per impostazione predefinita, il tipo MIME di una pagina è impostato su text/html. È possibile tuttavia eseguire l'override del tipo MIME della pagina impostando l'attributo ContentType nella direttiva @ Page, come illustrato nell'esempio di codice riportato di seguito.

<%@ Page Language="VB" ContentType="application/xhtml+xml" %>
<%@ Page Language="C#" ContentType="application/xhtml+xml" %>

Pagina di esempio ASP.NET con gli elementi XHTML necessari

L'esempio di codice seguente mostra una semplice pagina ASP.NET conforme XHTML.

<%@ Page Language="VB" AutoEventWireup="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<script >
Sub Button1_Click(sender As Object, e As EventArgs)
    Label1.Text = "Built at " & DateTime.Now.ToString()
End Sub

Sub listFruit_SelectedIndexChanged(sender As Object, e As EventArgs)
    Label1.Text = "You selected " & listFruit.SelectedItem.Text
End Sub
</script>

<head >
  <title>ASP.NET XHTML Page</title>
</head>

<body>
  <form id="Form1" >
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox  id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label  id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button  id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script >
void Button1_Click(Object sender, EventArgs e)
{
    Label1.Text = "Built at " + DateTime.Now.ToString();
}
void listFruit_SelectedIndexChanged(Object sender, EventArgs e)
{
    Label1.Text = "You selected " + listFruit.SelectedItem.Text;
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
  <title>ASP.NET XHTML Page</title>
</head>
<body>
  <form id="Form1" >
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox  id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label  id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button  id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>

Tenere presente quanto segue:

  • L'elemento form non contiene un attributo action perchè l'attributo action viene aggiunto durante il rendering della pagina.

  • Le proprietà di formattazione del controllo Label eseguiranno il rendering come attributi style.

  • Poiché non viene eseguito il rendering dell'elemento script contenente lo script lato server in un browser, tale elemento non richiede un attributo type.

  • La pagina esegue il rendering dello script lato client in fase di esecuzione per attivare il comportamento di postback automatico del controllo ListBox, ma esegue il rendering dello script in modo che questo sia compatibile con XHTML.

Conformità XHTML di testo statico ed elementi HTML

ASP.NET non modifica il testo statico o gli elementi HTML non lato server inseriti in una pagina. Ad esempio, una pagina Web ASP.NET può includere i controlli TextBox e Button, nonché testo statico inserito tra i tag <p></p>. ASP.NET può eseguire il rendering XHTML per i controlli TextBox e Button, ma non può eliminare errori XHTML presenti tra i tag <p></p>. Durante la creazione di testo statico o di elementi HTML, verificarne sempre la conformità XHTML. È possibile verificare le pagine tramite convalida, come illustrato nella sezione successiva.

Gli attributi sconosciuti di controlli HTML vengono passati all'output del controllo risultante e non verranno convalidati come tag XHTML validi. Ad esempio, la specifica dell'attributo ID per il controllo HtmlHead darà come risultato un tag che non è totalmente conforme a XHTML 1.0. Per convalidare il tag, utilizzare un servizio di convalida di tag quale il servizio di convalida dei tag W3C (World Wide Web Consortium).

Verifica della conformità XHTML delle pagine Web ASP.NET

Dopo aver creato pagine Web ASP.NET, è possibile verificare se l'XHTML risultante dal rendering delle pagine è corretto. Se la pagina contiene controlli server Web ASP.NET, è impossibile verificarla in fase di scrittura perché i controlli eseguono il rendering XHTML solamente durante l'esecuzione della pagina.

Nota:

Alcune finestre di progettazione visiva, come Visual Studio, possono consentire la convalida dell'XHTML del codice della pagina in fase di progettazione.

Per convalidare l'XHTML per le pagine, è necessario utilizzare un servizio che esegua la pagina e ne verifichi i risultati. Una strategia comune è quella di pubblicare le pagine su un server pubblico. Tale server può essere un server di test; benché non debba necessariamente essere un server di produzione, è necessario che sia accessibile via Internet. È possibile utilizzare un servizio di convalida in grado di leggere le pagine a livello di codice.

Un servizio diffuso è quello di convalida del codice W3C gestito dal World Wide Web Consortium. Per utilizzare questa convalida, immettere l'URL della pagina che si desidera venga verificata dal servizio. Il sito di convalida richiede la pagina e genera un rapporto contenente tutti gli errori rilevati. In alternativa, è possibile salvare il codice sorgente di una pagina Web e inviarlo come file al servizio di convalida. Per ulteriori informazioni su questo servizio di convalida, vedere il sito Web W3C (informazioni in lingua inglese).

Se la pagina da verificare presenta contenuto dinamico o se gli utenti possono personalizzare le pagine Web del sito, è necessario testare pagine con contenuti diversi per verificare la validità di tutti i possibili contenuti della pagina. In alcuni casi questa operazione può risultare difficile, perchè la varietà di risultati della pagina è troppo ampia per poter essere verificata in modo efficace.

Configurazione delle funzionalità del browser per la convalida del codice

Quando viene elaborata una pagina, ASP.NET esamina le informazioni della richiesta relative al browser corrente ed esegue il rendering del codice in base al tipo di browser (stringa dell'agente utente). Per ulteriori informazioni, vedere Controlli server Web ASP.NET e funzionalità del browser.

Se si inoltra una pagina Web ASP.NET a un servizio di convalida quale il servizio di convalida del codice W3C, ASP.NET potrebbe eseguire il rendering di una versione della pagina che non è conforme agli standard XHTML. Ciò si verifica in quanto il servizio di convalida non si identifica come tipo di browser riconoscibile da ASP.NET, ad esempio Internet Explorer o Mozilla. Quando ASP.NET non è in grado di riconoscere il tipo di browser, esegue automaticamente il rendering di un codice di livello inferiore che non include elementi e attributi conformi allo standard XHTML o funzionalità quali i fogli di stile CSS.

È possibile configurare l'applicazione in modo che invii il codice corretto conforme allo standard XHTML al servizio di convalida mediante la creazione di una definizione del browser per la stringa dell'agente utente del servizio di convalida. Il servizio di convalida del codice W3C segnala, ad esempio, un agente utente che inizia con "W3C_Validator". Per creare una definizione del browser per il servizio di convalida W3C, è possibile creare un file con estensione browser nella cartella App_Browsers dell'applicazione (assegnando al file browsers un nome qualsiasi) e quindi aggiungere l'elemento browsers riportato di seguito.

<browsers>
  <browser id="W3C_Validator" parentID="default">
    <identification>
        <userAgent match="^W3C_Validator" />
    </identification>
    <capabilities>
      <capability name="browser"              value="W3C Validator" />
      <capability name="ecmaScriptVersion"    value="1.2" />
      <capability name="javascript"           value="true" />
      <capability name="supportsCss"          value="true" />
      <capability name="tables"               value="true" />
      <capability name="tagWriter" 
         value="System.Web.UI.HtmlTextWriter" />
      <capability name="w3cdomversion"        value="1.0" />
    </capabilities>
  </browser>
</browsers>

Per ulteriori informazioni sulla creazione delle definizioni del browser, vedere Schema del file di definizione del browser (elemento browsers).

Eccezioni alla conformità XHTML

Anche se ASP.NET genera codice conforme allo standard XHTML, alcuni controlli supportano funzionalità opzionali che, se utilizzate, potrebbero generare codice non conforme.

Nota:

Ciascun controllo esegue il rendering del proprio codice. I controlli personalizzati di terze parti potrebbero generare risultati non conformi XHTML. Se si utilizza un controllo personalizzato, verificare con il fornitore del controllo quali standard sono supportati.

Attributo Target

Esempi di controlli che potrebbero generare codice non conforme sono i controlli che consentono di includere un attributo target per specificare il comportamento sul lato client:

Le pagine che includono i controlli con il rispettivo insieme di attributi target non verranno convalidati in base alla specifica XHTML 1.1. Se è indispensabile creare pagine che siano conformi al 100% agli standard XHTML 1.1, si consiglia di evitare l'utilizzo di opzioni, come l'attributo target, che generano codice non conforme.

Elemento Select

Un controllo DropDownList o ListBox consente di creare selezioni singole o di più elementi. I controlli DropDownList e ListBox eseguono il rendering di un elemento HTML select. Se il controllo DropDownList o ListBox non contiene almeno un controllo ListItem, l'elemento select risultante non conterrà elementi option figlio e non verrà convalidato per XHTML 1.1.

Vedere anche

Attività

Procedura: configurare il rendering di XHTML nei siti Web ASP.NET