La nuova versione 2.0 del Framework .NET, quella associata al nuovo tool di sviluppo Visual Studio 2005 prodotto da Microsoft, rappresenta una importante evoluzione rispetto alle versioni precedenti. Uno degli obiettivi che hanno caratterizzato il "refactoring" del Framework, è stato sicuramente la volontà di ottenere una struttura dei tipi molto flessibile e facilmente estendibile. Accanto alle implementazioni di default, vengono infatti forniti molti tipi astratti e interfacce utili a creare personalizzazioni ed estensioni. Il paradigma dei provider è l'esempio più eclatante di questo tentativo fatto da Microsoft (e, a mio avviso, ben riuscito) di mettere gli sviluppatori in condizione di poter personalizzare a piacimento le proprie applicazioni, estendendo e organizzando la propria struttura di classi a partire da un modello comune e condiviso.
Per quanto riguarda ASP.NET 2.0, questa volontà di rendere flessibili ed estendibili le applicazioni non ha riguardato solamente il modello delle classi. Struttura delle pagine, modularità ed estetica sono aspetti che da sempre hanno caratterizzato e tutt'oggi caratterizzano le applicazioni web. La nuova versione di ASP.NET affronta queste problematiche in un'ottica diversa rispetto al passato, fornendo nuove soluzioni concrete orientate a migliorare il look&feel delle applicazioni e a garantire una alta produttività in fase di sviluppo.
In questo articolo affronteremo solamente alcune delle novità introdotte con la nuova versione del Framework che riguardano lo sviluppo di applicazioni web. In particolare, parleremo delle Master Pages e dei nuovi controlli standard, che rappresentano le novità più evidenti di quanto è stato fatto per incentivare la produttività degli sviluppatori, garantendo il raggiungimento dei requisiti di tipo funzionale. Parleremo inoltre dei temi che rappresentano di fatto la soluzione più importante introdotta per migliorare la resa grafica delle applicazioni web.
Master Pages
Con le WinForms da sempre è stato possibile sfruttare l'ereditarietà visuale per strutturare l'interfaccia utente, dato che una Form è una classe che può contenere controlli e da essa è possibile derivare secondo il paradigma della programmazione orientata agli oggetti. Non si può dire la stessa cosa per le WebForms, per le quali non è mai stato possibile parlare di ereditarietà visuale, a causa della presenza del codice di markup. Pertanto nella realizzazione di applicazioni web si sono sempre cercate strade alternative all'ereditarietà visuale, cercando di sfruttare al meglio la possibilità di modularizzare le pagine, al fine di minimizzare il lavoro svolto e favorire il riuso del codice.
Con Classic ASP il meccanismo utilizzato per ottenere lo scopo è stato l'inclusione di file sfruttando SSI (Server Side Includes), con tutti i limiti del caso (tra cui il fatto di non essere un approccio object-oriented). Questo approccio è stato in seguito soppiantato dagli User Controls di ASP.NET 1.x, tramite cui è stato possibile trattare ogni singola porzione di una pagina ASPX come un controllo custom definito dallo sviluppatore. Per risolvere e superare i limiti della soluzione basata su User Controls, in ASP.NET 2.0 è stato introdotto un nuovo meccanismo basato su Master Pages e Content Pages. Anche se non risolvono il problema dell'ereditarietà visuale, le Master Pages forniscono una struttura comune e condivisa tra tutte le pagine che da esse dipendono, sia da un punto di vista grafico che logico.
Una Master Page rappresenta una sorta di template, che, oltre a contenuti dinamici e statici, contiene alcune aree (rappresentate da altrettanti controlli di tipo ContentPlaceHolder) riempibili con i contenuti definiti nelle varie sezioni delle Content Pages associate. Per un sito Web è possibile definire più Master Pages; questo permette di poter disporre di template diversificati per ciascuna sezione del sito.
Una Master Page è un file con estensione .master, ha una sintassi del tutto analoga ad una normale pagina ASPX, se non fosse per il fatto che la direttiva @Page è sostituita con la direttiva @Master. Come detto, una Master Page contiene una serie di controlli ContentPlaceHolder, che identificano alcune regioni personalizzabili il cui contenuto viene caricato a runtime a partire da una Content Page. In linea di massima, una Master Page priva dei controlli ContentPlaceHolder non ha senso di esistere.
<%@ Master Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" > <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>ASPItalia.com - Master Pages, Themes & Standard Controls</title> <link type="text/css" rel="Stylesheet" href="Styles.css" /> </head> <body> <form runat="server"> <div class="clsHeader"> <asp:ContentPlaceHolder ID="MasterHeader" Runat="server"> </asp:contentplaceholder> </div> <hr /> <div class="clsBody"> <asp:ContentPlaceHolder ID="MasterBody" Runat="server"> </asp:ContentPlaceHolder> </div> <hr /> <div class="clsFooter"> <asp:ContentPlaceHolder ID="MasterFooter" Runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html>
Una Content Page è una pagina ASPX che contiene unicamente controlli di tipo Content. Alla Content Page è associata una Master Page contenente i ContentPlaceHolder corrispondenti ai controlli di tipo Content. Di fatto un controllo Content rappresenta il contenuto effettivo per un ContentPlaceHolder della Master Page. La corrispondenza tra Content e ContentPlaceHolder si basa sul valore della proprietà ID del placeholder.
<%@ Page Language="c#" MasterPageFile="MasterPage.master" %> <asp:Content ID="PageHeader" Runat="server" ContentPlaceHolderID="MasterHeader"> <div>HEADER</div> </asp:Content> <asp:Content ID="PageBody" Runat="server" ContentPlaceHolderID="MasterBody"> <div>BODY</div> </asp:Content> <asp:Content ID="PageFooter" Runat="server" ContentPlaceHolderID="MasterFooter"> <div>FOOTER</div> </asp:Content>
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.