ASP.NET e modifica Temi a runtime

mercoledì 12 dicembre 2012 - 18.02
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows XP  |  Visual Studio Express  |  MySQL 5.1  |  Firefox  |  Javascript  |  CSS 2.1  |  CSS 3.0  |  XHTML 1.1

ravalon Profilo | Expert

Salve a tutti,
ho costruito negli anni un ottimo CMS in ASP.NET e per quanto io sia soddisfatto delle funzionalità, mi stavo ponendo il problema di differenziare l'aspetto grafico e strutturale del mio lavoro.

Ho già creato un sistema che, semplicemente caricando nuove cartelle dentro la directory APP_THEMES permette all'utente di cambiare il tema a runtime semplicemente scegliendo la cartella del tema che si vuole utilizzare....
...ma questo non mi basta...

...infatti per quanto si possano cambiare colori, scritte, font etc etc, l'ossatura grafica rimane quella in quanto ho utilizzato una masterpage.
Strumento fantastico ma dato che compilo il sito prima di distribuirlo, non posso stravolgere il layout del lavoro svolto a runtime in quanto la masterpage non sta dentro la APP_THEMES, per cui pur cambiando varie cose, la struttura rimane sempre la stessa...

Vorrei fare qualcosa come in Wordpress, dove essendo di fronte alla modularità degli script è una cosa discretamente facile decidere se mostrare un layout o un altro....lo era anche in ASP Classic ma aihmè non lo è affatto su ASP.NET, almeno per quel che ne so io...

Potreste consigliarmi qualche idea o una strada da seguire? Grazie !!

andrestu Profilo | Expert

Bella domanda Ravalon,
io sto seguendo pressochè lo stesso percorso, praticamente mi son creato un template che fa utilizzo di una masterpage con custom control e altre funzioni varie utili allo sviluppo e sono arrivato a pormi lo stesso quesito.
Diciamo che i modi per personalizzare CSS e quant'altro si possa agganciare alla struttura di base sono molteplici, basta avere un pò di creatività e il tutto è gestibile senza neanche usare i temi di aspnet, altra cosa invece è cambiare la struttura dell'html mantenendo la logica della pagina inalterata.
Dal mio punto di vista il problema principale sta proprio nell'utilizzo dei vantaggi che fornisce Aspnet, e cioè Custom Control e User Control, dal momento che inserisci nella pagina uno di questi diventa tutto più complicato gestire dei multi-layout sopratutto se questi fanno rendering.
Una soluzione potrebbe essere quella di creare pagine .aspx differenti che si agganciano allo stesso file code-behind .cs e configurare tutta la logica tramite codice anche se poi comunque rimarrebbe il problema accennato prima, e cioè se io inserisco nella pagina un controllo quel controllo avrà una certa logica interna, ecco che mi ritroverei della logica duplicata per tutte le pagine, quindi diventa abbastanza un delirio dividere logica della pagina da layout.
Forse la soluzione più pulita a questo problema sta nell'utilizzare MVC.

Andrea Restucci - Web Developer

ravalon Profilo | Expert

Ciao e grazie per la tua partecipazione....

..hai detto bene, i grandi controlli di ASP.NET in tal caso mettono i bastoni tra le ruote e non poco, un tempo questo aspetto dello sviluppo era molto più libero diciamo...

MVC non lo conosco per niente, ho fatto largo uso di AJAX e User control per incapsulare i classici INCLUDES come si faceva con ASP Classic e per quelli non avrei problemi dato che il funzionamento è slegato dal layout...

...ho invece grossi problemi a pensare come diversificare l'aspetto finale... avere speso anni in sviluppo di un CMS bello e funzionale serve a poco, nell'ottica degli utenti più esigenti (o che se ne intendono meno) se poi non puoi diversificare il risultato estetico... metti che lo dai a due-tre persone già c'hanno l'idea di avere dei siti pressochè identici e si sa quanto conta oggigiorno un bell'aspetto (anche se io prediligo la funzionalità).

Che dire, rimaniamo in contatto, ultimamente non ci ho pensato granchè, diciamo che inizio ora...se hai un qualche risultato apprezzabile o ti viene in mente qualcosa fammi sapere, te ne sarei grato....
...poi magari qualche illuminato ci suggerisce una soluzione semplice e snella chissà

andrestu Profilo | Expert

ma, io non so quale possa essere il tuo obiettivo finale ma secondo me bisogna pensare in un ottica di sviluppo personale, CMS ce ne sono già tanti in giro e anche open source, quindi fare concorrenza secondo me sarebbe molto difficile, nel senso che da solo andresti a scontrarti con una quantità di problematiche che farli risolvere ad un unico cervello diventa troppo dispendioso in termini di tempo, vedi per esempio questa ultima "problematica" del layout, credo che in qualche modo sia già stata affrontata e risolta anche bene da altri CMS.
Dal mio punto di vista però quello che stiamo facendo non è tempo "sprecato", cioè in altre parole, sarà difficile implementare un sistema di gestione dei layout ma perlomeno abbiamo costruito una base solida per sviluppare qualsiasi sito, anche se il tuo sistema non implementerà lo switch automatico del layout, una volta che hai la struttura già bella che pronta con la logica funzinante ci vuole veramente poco a cambiare l'html, e ovvio che si dovrà optare per un sistema poco intelligente, cioè copia brutale del progetto e via di modifiche al layout ma daltronde non si può avere tutto bisogna anche considerare gli sforzi in termini di tempo.
Comunque giusto per condividere la mia esperienza ultimamente ho creato per un cliente questo sito http://www.piazzaaffariimmobiliare.it/ è praticamente un gestionale per agenziae immobiliari, ovviamente questa è una versione di base ma comunque ha già diverse caratteristiche interessanti.
In questi giorni sto ottimizzando il codice in diversi aspetti, l'intenzione sarebbe quella di creare una base da vendere alle agenzie immobiliari con la possibilità di avere diversi layout in modo da far scegliere al cliente quello che preferisce ed è questo il punto cruciale che incontra il tuo quesito, come faccio a mantenere la logica delle pagine modificando solo la struttura html ?
bel casino insomma, per il momento non sono ancora arrivato ad affrontare il prpblema ma presto dovrò decidere una strategia.


Andrea Restucci - Web Developer

ravalon Profilo | Expert

Si hai ragione ma io sono un artigiano dell'informatica....sai come quello che ti dice...se vuoi un mobile ichea prendilo pure....spenderai poco, sarà funzionale e te lo danno in 3 giorni....se poi vuoi una cosa veramente curata vieni da me che te la faccio e non avrai bisogno di altro !

Ne ho provati di CMS....ce ne fosse uno che ha tutto quello che ti serve per un determinato scopo e che sia semplice...ho deciso di farmelo da me proprio per avere una base che con pochi click vegna stravolta nell'aspetto pur mantenendo le funzionalità che io ho costruito ad hoc per fare commercio elettronico, un motore costruito da zero anche grazie a questo forum ! (ringrazio nuovamente tutti !!!)

Ho trovato già delle soluzioni, domani ci studio un po e le provo, pare che si possa fare....

andrestu Profilo | Expert

anche io avevo iniziato a sviluppare un CMS, praticamente si basava sull'inserimento dinamico di controlli nella pagina, questi controlli venivano caricati dinamicamente leggendo dati dal db così bastava modificare record del db per modificare il contenuto della pagina, poi ho abbandonato, però chissà mai che un giorno non mi venga voglia di riprendre il progetto. Mi ricordo che avevo avuto qualche problema con il caricamento dinamico all'interno degli update panel.

Posta le soluzioni che trovi per quanto riguarda il layout che sono interessato all'argomento, così ne discutiamo...

Ciao a presto e buon lavoro !!!

ravalon Profilo | Expert

Allora.... ho risolto senza troppi problemi, riesco a far caricare dinamicamente qualsiasi masterpage io voglio, legata ovviamente ad un tema che imposto e di cui posso avere anche una anteprima....sostanzialmente bastava documentarsi un po .... cosi adesso posso stravolgere completamente il layout in pochi click, avendo ovviamente preconfezionato i temi utilizzabili e la relativa masterpage!

Il problema che rimane è che le masterpage, non potendo trovarsi dentro la cartella dei temi (la APP_THEMES è una cartella protetta particolare ed al suo interno non può stare una masterpage), deve essere già dentro alla cartella radice del sito (o in un'altra cartella costruita ad hoc)...

...il mio lavoro è precompilato, per cui non posso aggiungere le masterpage in un secondo momento come invece posso fare con i temi, dove basta caricare via FTP una cartella del tema, quindi attualmente ho risolto ma con questo inconveniente...devo prevedere, ad ogni versione compilata, la presenza a priori delle masterpage dei temi.
Non è poi un grosso problema, semmia si tratta di files superflui se l'utente non carica i relativi Temi in quanto il mio CMS permette di impostare altri Temi solo se sono presenti le relative cartelle...

Probabilmente se non precompilassi il sito e distribuissi i files come si faceva con ASP Classic riuscirei ma non è una cosa che mi aggrada....cerco soluzioni in merito e vediamo che ne viene fuori, per il momento continuo a migliorare il lavoro svolto fino ad ora...

...non so se ti può interessare, se vuoi ti posso postare il principio di funzionamento per il caricamento dei temi, in stile elenco analitico, con qualche pezzo di codice che serve per impostare Masterpage e temi una volta che hai tutto il resto del codice che opera la visualizzazione e la scelta del tema....

andrestu Profilo | Expert

scusa ma mi sfugge un concetto, tu utilizzi nelle tue pagine controlli aspnet ?
come fai a separare la logica dal rendering in base ad un tema ?
come fai a separare l'intera struttura html della pagina dalla logica della pagina quando normalmente queste due cose sono mischiate nella stessa struttura di pagina ?

cioè astraendo il più possibile partiamo da un esempio banale, io ho una pagina con un controllo Button, il controllo button effettua un tipo di rendering ed ha una sua logica, a questo punto faccio due layout diversi in due pagine separate, amettiamo che trovo il modo di caricare o una o laltra in base al layout, resta il fatto che ognuna al sua interno avrà il tag del controllo Button.
A questo punto se volessi cambiare la struttura del layout senza interferire sulla logica ?
se voglio modificare il button devo farlo su tutte e due le pagine.
cioè l'unica cosa che mi viene in mente per risolvere il problema o ogni controllo che usi viene relazionato al tema e quindi avrò anche differenti modi di renderizzarsi oppure la pagina non deve avere nessun controllo ma solo tag html puro con espressioni di binding che valorizzano la struttura html...

Andrea Restucci - Web Developer

ravalon Profilo | Expert

Devi partire dal concetto che tutte le pagine del sito fanno riferimento allo stesso tema che da loro la struttura di layout....
...quindi la cornice del sito, che sia a una colonna, a due colonne ecc ecc è data dalla Masterpage.
...ogni pagina ha un proprio contenuto, che viene mostrato dentro la struttura della masterpage e che quindi è un semplice box, grande quando il layout permette ovviamente...

...i controlli dentro la pagina, che è incapsulata dentro la masterpage, svolgono sempre e comunque il proprio dovere nello stesso modo, con le solite voci e funzioni ma vengono messe in punti diversi della pagina visualizzata a seconda di come è costruita la masterpage...

cosi, per fare un esempio, in uno stile a 3 colonne, le 2 colonne laterali sono visualizzate dalla masterpage mentre la centrale è data dal codice della pagina che si sta visualizzando....
...cambiando il layout(cioè cambiando la masterpage cui tutte le pagine si riferiscono) e impostandolo ad 2 colonne anzichè 3, avremo il contenuto leggermente spostato a destra, mentre la colonna di sinistra sarà sempre mostrata dalla masterpage...i contenuti che venivano caricati nella 3 colonna, quella di destra, saranno mostrati o nella colonna di sinistra o da un'altra parte...dipende come costruisci la masterpage...

infine se imposto la masterpage senza colonne (o a colonna unica) non faccio altro che mostrare (per fare un esempio) tutti i controllo che prima erano richiamati nelle colonne laterali nella zona centrale della pagina, magari prima o dopo i contenuti specifici della pagina...

...in sostanza, cambi totalmente la forma del layout pur mantenendo sempre le stesse funzioni e controlli.
...non so se ho risposto alla tua domanda....

andrestu Profilo | Expert

mmm potrebbe essere una soluzione interessante, anche se non è proprio come la intendevo io, cioè non cè una separazione netta tra logica e rendering visto che nella pagina contenuto potrebbero esserci dei controlli che effettuano il rendering, bisognerà agire su quei controlli cercando di differenziare impostando css diversi in base al tema, quindi il tema nel complesso sarà dato dalla struttura della masterpage + dalle varie impostazioni dei controlli che saranno impostati in base al tema scelto.
Si magari proverò a seguire questa strada l'unica cosa che non ho mai fatto è il cambio dinamico di master page ma in rete dovrebbe esserci documentazione a sufficenza.
fammi sapere come procede...

Andrea Restucci - Web Developer

ravalon Profilo | Expert

La modifica al layout nel mio caso è data da masterpage (che fa l'ossatura strutturale e la disposizione dei controlli nello spazio) , CSS del foglio di stile e dalle immagini del tema... in più ho usato anche skin files ma è una cosa che può essere evitata...

il cambio della masterpage lo fai al volo con il codice

page.MasterPageFile = "~/NomeMasterPage.master"

Devi solo capire da dovre prendere il valore del nome della masterpage...nel mio caso sfrutto il valore del webconfig "masterPageFile=" dove è scritta la master preimpostata per tutto il sito... la estrai e la usi, oppure se implementi un codice che ti fa scegliere il tema come nel mio caso la modifichi a tuo piacimento con il nome di un altro file e la scrivi sul web.config....

...il web.config essendo il file di configurazione di tutto il sito rende automaticamente l'impostazione a tutte le pagine.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5