Abbiamo introdotto in un precedente articolo cosa sono i Web Controls, o i controlli server, il loro ruolo fondamentale nelle realizzazione di applicazione ASP.NET.
Vedremo come cominciare a realizzare dei nostri server controls. Sebbene i controlli messi a disposizione dal framework siano già abbastanza per poter lavorare egregiamente, l'abilità di saper creare server controls non è una pratica da seguire solo perché si vuole far usufruire ad altri funzionalità avanzate e di facile riutilizzo.
A tale scopo infatti mirano già tanti sviluppatori (è possibile trovare una lista a questo indirizzo ), ma il maggior tempo impiegato per la realizzazione di un control sarà premiato con il suo facile riutilizzo per altre nostre future applicazioni web.
L'esempio: PopupButton
Nell'esempio creeremo un PopupButton, un oggetto molto simile ad un LinkButton (namespace System.Web.UI.WebControls ) che però apre una finestra popup quando premiamo e fa scatenare un evento lato server quando questa viene chiuso.
Il risultato si può capire meglio da questo screenshot:
Funzionamento del control
Per creare un controllo basta ereditare dalla classe System.Web.UI.Control . Ogni entità della nostra pagina, web control, tag HTML o una semplice stringa, è infatti nient'altro che un oggetto che eredita da Control (perfino la classe Page stessa) e che va a popolare la collezione Controls del control padre.
Si capisce meglio il concetto con un esempio:
<%@ Page language="c#" debug="true" %> <form runat="server"> <asp:linkButton runat="server".../> questa è una riga </form>
In queste poche righe ci sono ben 3 oggetti Control:
- HtmlForm (System.Web.UI.HtmlControls), il tag 'form';
- LinkButton (System.Web.UI.WebControls), il tag 'asp:linkButton'
- LiteralContro l (System.Web.UI), la dicitura 'questa è una riga. Ogni entità che non presenta l'attributo runat="server" viene trasformato in un LiteralControl.
Per chi non ci crede, basta creare la nostra pagin, attivare il debug, caricare la stessa nel browser e andare a vedere l'assembly prodotto da ASP.NET.
Il motore salva l'assembly e la sua sorgente in una directory temporanea allocata in
C:\WINDOWS\Microsoft.NET\Framework\vx.y.zzzz\Temporary ASP.NET Files\nomeapplicazioneweb\cartellatemporanea\
Andando a leggerne il contenuto, troveremo un file dal nome incomprensibile (non ci soffermiamo sui dettagli) con estensione cs (o vb se stiamo usando VB.NET): apriamalo e noteremo per primo che ha creato una classe che eredita da Page e istanzia due oggetti:
public class control_aspx : System.Web.UI.Page,System.Web.SessionState.IRequiresSessionState { private System.Web.UI.WebControls.LinkButton __control3; private System.Web.UI.HtmlControls.HtmlForm __control2;
e più avanti ancora
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\tquesta è una riga\r\n"));
Ho ovviamente omesso le righe non necessarie.
La funzione AddParsedSubObject dell'interfaccia System.Web.UI.IParserAccessor (implementata da Control) ha il compito di popolare la propria collezione Controls qualora accetti controlli figli. Il codice prodotto dal motore ASP.NET non fa altro che aggiungere alla collezione in modo ricorsivo i controlli che man mano ha rilevato parserizzando la nostra pagina. La struttura HTML (se scritta corretamente) è gerarchica proprio in questo modo e ogni entità può contenere altre entità che possono contenere altre entità ecc.
La parte pratica
Creiamo quindi una classe che erediti da Control. Nel caso specifico però, erediteremo da WebControls, perché questa classe implementa già delle proprietà per applicare stili che vedremo poi meglio in dettaglio:
public class PopupButton : System.Web.UI.WebControls.WebControl { public PopupButton():base("a") { } }
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.