Control adapter per cambiare l'output dei controlli di ASP.NET 2.0

di Daniele Bochicchio, in ASP.NET 2.0, Custom Control,

Sin dalla prima versione di ASP.NET, l'adaptive rendering è stata la croce e la delizia di molti sviluppatori. E' quella funzionalità, infatti, che adatta il rendering dei controlli in base al device che lo richiede, emettendo il markup più opportuno in base allo user agent ed alla sue caratteristiche.

Quello che rende interessante l'adaptive rendering della versione 2.0 è la possibilità, in maniera molto semplice, di definire delle classi che possano cambiare l'ouput dei controlli, chiamati control adapter.

Un control adapter è tendenzialmente utilizzato per modificare il markup emesso da una classe, senza necessità di toccare la definizione della stessa nelle parti in cui viene utilizzata, perchè viene semplicemente cambiato il modo in cui il controllo emette il markup.

Supponendo di voler rimuovere le tabelle dal controllo CheckBoxList, ad esempio, si potrebbe realizzare un control adapter come il seguente:

namespace ASPItalia.Web.UI.Adapters
{
  public class CheckBoxListAdapter : WebControlAdapter
  {
    protected override void RenderBeginTag(HtmlTextWriter writer)
    {
      writer.WriteLine();
      writer.WriteBeginTag("div");
      writer.Write(HtmlTextWriter.TagRightChar);
      writer.Indent++;
    }

    protected override void RenderEndTag(HtmlTextWriter writer)
    {
      writer.WriteEndTag("div");
      writer.Indent--;
      writer.WriteLine();
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
      writer.Indent++;

      CheckBoxList list = Control as CheckBoxList;
      if (list != null)
      {
        CheckBox box;
        foreach (ListItem item in list.Items)
        {
          writer.WriteLine();
          writer.WriteBeginTag("div");
          writer.Write(HtmlTextWriter.TagRightChar);
          writer.WriteLine();
          writer.Indent++;

          box = new CheckBox();
          box.Text = item.Value;
          box.RenderControl(writer);

          writer.WriteLine();
          writer.Indent--;
          writer.WriteEndTag("div");
          writer.WriteLine();
        }
      }

      writer.Indent--;
    }
  }
}
}

A questo punto, è necessario registrarlo all'interno di un file dall'estensione .browser, da inserire nella directory App_Browser.

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter
        controlType="System.Web.UI.WebControls.CheckBoxList"
        adapterType="ASPItalia.Web.UI.Adapters.CheckBoxListAdapter"
      />
    </controlAdapters>
  </browser>
</browsers>

Mettendo "Default" come valore della proprietà refID, l'effetto è quello di far funzionare questo adapter per qualsiasi browser, ma è possibile specificando in maniera opportuna a quale famiglia di user agent è associato, modificare il comportamento del controllo solo in presenza di questa eventualità.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi