Aggiungere controlli dinamicamente con ParseControl

di Cristian Civera, in ASP.NET, C#,

La caratteristica principale di ASP.NET è quella di disporre di un motore di parsing in grado di convertire codice o porzioni di codice HTML/XML in controlli dalle funzionalità più banali, come il LiteralControl che semplicemente scrive del codice HTML, oppure più avanzati, come il DataGrid che offre funzionalità di paginazione, sorting ecc.
Tutto questo processo di conversione viene effettuato alla prima richiesta di una pagin, ma può essere sfruttato anche dinamicamente per parserizzare stringhe di codice. Per far ciò basta utilizzare la funzione ParseControl della classe TemplateControl dalla quale derivano sia Page che Control. Essa restituisce un Control contenitore con tutte le istanze già create.
Un esempio chiarirà sicuramente ogni dubbio:

<%@ Page Language="c#" Debug="true" EnableViewState="false" %>
<script runat="server">

private DropDownList list;

void Page_Init(object s, EventArgs e)
{
  // .... operazioni per avere il codice ASP.NET
  string codeToParse = "Lista <asp:DropDownList runat=\"server\" id=\"list\"/>";
  
  // Parserizzo i controlli
  Control c = this.ParseControl(codeToParse);
  // Lo aggiungo alla form
  form.Controls.Add(c);
  
  // Recupero il riferimento alla DropDownList
  list = (DropDownList)c.FindControl("list");
}

void Page_Load(object s, EventArgs e)
{
  list.Items.Add("item 1");
}

</script>
<form runat="server" id="form">
</form>

Il codice è commentato passo per passo. Partiamo da una stringa codeToParse contenente il codice ASP.NET la quale può provenire da qualsiasi fonte. Personalmente sfrutto molto questa tecnica in seguito a trasformazione XSLT su fonti XML prese da database al fine di eseguire un'unica query per l'intera pagina. Una volta parserizzato cerchiamo il controllo tramite FindControl e manteniamo un riferimento ad esso tramite una variabile, conservando il normale approccio di accesso ai controlli.
E? necessario prestare molta attenzione a questo tipo di metodo poiché pur offrendo una tecnica molto utile non dispone di nessun tipo di caching. Il lavoro di parsing è infatti pesante, quindi usatelo con parsimonia, in quelle pagine alla quali è possibile applicare politiche di output caching.

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