Home Page Home Page Tips & Tricks Applicare i Temi a Runtime in pagine con MasterPage in ASP.NET 2.0

Applicare i Temi a Runtime in pagine con MasterPage in ASP.NET 2.0


Con la versione 2.0 di ASP.NET vengono finalmente introdotte le MasterPage, ovvero una sorta di "modello" comune che a tutte le pagine che da' il "taglio estetico" al sito e ci permette di essere molto flessibili nell'impaginazione condividendo una parte comune.

Qualcosa si poteva fare bene ugualmente con i fogli di stile e gli WebControl, ma adesso si puo ottenere qualcosa di molto raffinato, ancora meglio se combinando il tutto con i temi come spiegato qui:
http://www.dotnethell.it/articles/ASPNETThemesSkins.aspx 

A questo punto il passo successivo è quindi avere la possibilita' di cambiare a runtime il tema,per lasciare la scelta all'utente magari coambiandolo "al volo" solo per quella sessione, insomma una sorta di login di Linux quando viene chiesto se scegliere KDE oppure GNOME ecc.
Per la modifica a runtime di ogni pagina singola basta usare l'override del metodo "OnPreInit" della pagina cambiando il tema alla pagina prima che venga renderizzata:

Codice .NET n°1
protected override void OnPreInit(EventArgs e) 
{
this.Theme = (string)Session["tema"] //si puo memorizzare in qualsiasi altro post magari nella sezione "profile" del web.config
}


Questo metodo viene scatenato ogni volta che viene elaborata la pagina, e prima del metodo Load, cosi' il tema puo' essere applicato (Il motivo è tecnico inquanto il runtime deve caricare i controlli e poi applicare le proprieta grafiche del tema renderizzandoli)
Ovviamente via via che si crea il sito sempre piu pagine dovrebbero sottostare a questa regola e un buon programmatore odia copiare ed incollare lo stesso codice piu volte (e se non lo odia dovrebbe cominciare a farlo ;-), percio' necessita di qualcosa di piu strutturato come magari una classe base.
Cosa che diventa inoltre necessaria nel caso di pagine che ereditino da una MastePage, in quanto in quest'ultime non si scatena l'evento OnPreInit e non ha nemmeno la proprieta' "Theme"...
Ecco che la il Framework 2.0 ci viene incontro e ci fornisce la sezione "<pages>" del web.config dove si possono specificare le proprieta' che valgono per tutte le pagine :



Ovviamente in questa sede utilizziamo solamente la possibilita di specificare la proprieta che ci interessa ovvero la classe base di ogni pagina:

<pages pageBaseType ="PaginaBase" >

per avere questa classe base caricata in ASP.NET Whidbey dobbiamo usare la directory "code" sotto la root della nostra applicazione web (fa la funzione del global.asax della versione 1.1) e renderla ovviamente pubblica:

Codice .NET n°2
public class PaginaBase : System.Web.UI.Page 
{
protected override void OnPreInit(EventArgs e)
{
this.Theme = (string)Session["tema"];
base.OnPreInit(e);
}
}


Da notare che è molto importante ovviamente richiamare il metodo "base.OnPreInit" che diciamo "fa il lavoro" di renderizzare la classe page.

Adesso basta solo decidere quando cambiare il valore sella variabile session["tema"], nell'esempio allegato si utilizza una pagina di login:



A questo punto l'utente potra' scegliere in fase di login come vuole che il sito appaia,dopo di che si puo pensare di memorizzarlo in vari posti come cookie,database etc...
Un aspetto interessante ci viene sfruttando ancora una volta il web.config in particolare la sezione "<profile>" dove è il runtime di .NET che si arrangia a memorizzare sul database aspnet.mdb sotto la directory "data" le nostre impostazioni ma questo magari lo vedremo in un altro Tip.
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5