in

DotNetMarche

.NET Framework User Group delle Marche

Caricamento UserControl senza ViewState

Last post 26 Mar 2009 3:05 by manuel.fabbrizi. 6 replies.
Page 1 of 1 (7 items)
Sort Posts: Previous Next
  • 24 Mar 2009 11:59

    Caricamento UserControl senza ViewState

    Ciao a tutti,

    magari le domande che mi appresto a fare non sono così intelligente... abbiate pazienza... :)

    Nella mia pagina con ViewState disabilitato ho un TreeView e, selezionando un nodo di quest'ultimo, devo caricare uno UserControl in un apposito Placeholder (uno diverso in base al nodo selezionato). Il controllo al suo interno ha altri controlli che possono mandare in POST la pagina. A questo punto, dopo il postback io devo gestire alcuni eventi...

    So benissimo che per poter gestire gli eventi devo ricaricare lo UserControl ad ogni postback. La prima domanda è: in quale evento della Page lo faccio? OnInit? OnPreLoad?

    La seconda domanda è: quando la pagina va in POST come faccio a caricare lo stesso controllo caricato in precedenza, magari con lo stesso stato (lo stato dovrebbe essere salvato nel ControlState che non è disabilitabile)?

    Grazie in anticipo.

    Manuel

  • 24 Mar 2009 14:03 In reply to

    Re: Caricamento UserControl senza ViewState

     Lavorare senza viewstate non è facile. Quello che manca al motore di asp.net è conoscere lo stato precedente dei controlli, quindi non ti lancia gli onindexchanged delle dropdown etc. Altra cosa che manca, nelle griglie, nelle treeview, è il ripristino automatico del valore precedente, ad esempio per una gridview è necessario rieffettuare il binding ogni volta. 

    Solitamente questo lavoro viene fatto nell onload. Per il discorso di caricare lo usercontrol ad ogni postback puoi usare degli hiddenfield (il loro valore lo trovi sempre in post), oppure puoi adottare una tecnica di rendering parziale con jquery (visto che si avvicina il workshop :D). Purtroppo il viewstate è lo scotto che si paga per avere una mbiente ad eventi su un protocollo stateless come HTTP :(

    alk.

    --
    Continua ciò che hai cominciato e forse arriverai alla cima, o almeno arriverai in alto ad un punto che tu solo comprenderai non essere la cima. (Seneca)
    Alkampfer's Place
  • 25 Mar 2009 3:25 In reply to

    Re: Caricamento UserControl senza ViewState

    Grazie mille per la risposta. Sono d'accordo sul discorso riguardante il ViewState e devo ammettere che la storia è tutt'altro che facile. Diciamo che il mio era un tentativo di salvare qualcosa a livello di prestazioni...

    Per quanto riguarda il caricamento degli UserControl, il problema è che, da quanto ho letto, il controllo dovrebbe essere ricaricato nell'OnInit per poter poi avere successivamente accesso al suo ControlState. Solamente che in quella fase gli altri controlli (tra cui l'HiddenField) non hanno ancora il loro valore ripristinato (correggetemi se dico sciocchezze...).

     Riguardo al discorso jQuery, ho fatto qualche prova non credo che faccia al caso mio, anche se probabilmente parteciperò al workshop :)

    Manuel.

  • 25 Mar 2009 5:03 In reply to

    Re: Caricamento UserControl senza ViewState

     In asp.net la creazione dinamica dei controlli può essere fatta anche nell'onload con le dovute precauzioni, comunque è spesso una cosa infernale :D te lo dico perchè ci ho messo le mani più volte e sono giunto a conclusione che asp.net non è fatto per fare controlli dinamici.

    Comunque leggiti questo (http://weblogs.asp.net/infinitiesloop/archive/2006/10/16/TRULY-Understanding-Dynamic-Controls-_2800_Part-4_2900_.aspx) è la quarta parte ma ci sono i link alle prime 3, è un bellissimo articolo che spiega VERAMENTE TUTTO.

    poi naturalmente questo (http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx) che spiega TUTTO TUTTO sul viewstate ;)

    Se dopo averli letti hai ancora voglia di fare controlli dinamici :D buona fortuna. Per mia esperienza personale purtroppo diventa poco manutenibile, preferisco usare JQuery e fare un reale partial rendering delle varie parti della pagina con il viewstate completamente disabilitato e tutte richieste Get se possibile. 

    Se il viewstate è veramene (e sifnifica che hai misurato veramente) il tuo problema, prova a lasciarlo sul server tipo in un db o su file, per lo meno diminuisci la banda occupata e non hai problemi di viewstate.

    Sempre per esperienza le prestazioni nel web le aumenti mostruosamente usando consapevolmente la cache e spostando alcune operazioni molto comuni tutto su lato client interagendo con il server solamente con dei servizi (asmx o WCF).

    Detto questo, in bocca al lupo :D

    Alk.

    --
    Continua ciò che hai cominciato e forse arriverai alla cima, o almeno arriverai in alto ad un punto che tu solo comprenderai non essere la cima. (Seneca)
    Alkampfer's Place
  • 25 Mar 2009 5:04 In reply to

    Re: Caricamento UserControl senza ViewState

    Ciao Manuel,
     anche nella OnLoad mi sembra vada bene ricreare il control, poi il motore ripristina lo stato alla fine della chiamata.

    L'unico inconveniente (se la memoria non mi inganna, sono passati 3 anni..) la creazione al volo di uno usercontrol e la relativa associazione alla pagina va gestito diversamente in caso di control presente in un UpdatePanel (mi sembra di ricordare che era un bug del framework ajax). Il problema che si manifestava era proprio il mancato caricamento della controlstate dell user control.

     

  • 25 Mar 2009 5:37 In reply to

    Re: Caricamento UserControl senza ViewState

     Sempre a ram anche io, il problema dell'update panel è stato corretto nella versione finale di microsoft ajax che è nella 3.5 e dovrebbe anche nell'ultima versione per il 2005 perchè io lo uso in produzione ;) proprio in questa situazione. Mafai comunque attenzione. Il fatto che lo puoi fare nell onLoad è che il ProcessPostData viene lanciato due volte, come vedi dal ciclo di vita. Comunque si vede proprio che asp.net non ès tato pensato per il controlli dinamici, se dentro il tuo usercontrol utilizzi dei Validator standard e custom di asp.net è difficile farli funzionare a dovere...


    alk.

    --
    Continua ciò che hai cominciato e forse arriverai alla cima, o almeno arriverai in alto ad un punto che tu solo comprenderai non essere la cima. (Seneca)
    Alkampfer's Place
  • 26 Mar 2009 3:05 In reply to

    Re: Caricamento UserControl senza ViewState

    Intanto grazie ad entrambi per la risposta. Alla fine, dopo lungo soffrire ci sono riuscito a risolvere il problema.
    Le mosse fondamentali sono state 2:
    - Riabilitare il ViewState a livello di pagina e disabilitarlo per i controlli più "pesanti" ed usarlo per mantenere traccia dello UserControl da ricaricare
    - Caricare lo UserControl in fase di LoadViewState (che peraltro ho scoperto scatenarsi solo quando il ViewState non è vuoto, magari a sapercelo prima!!)

    Per quanto riguarda il problema che Andrea diceva riguardo l'UpdatePanel... per ora non sembra manifestarsi (incrociando le dita!!).

    Grazie di nuovo, ci vediamo forse al workshop. ;)

    Manuel

Page 1 of 1 (7 items)
Powered by Community Server (Commercial Edition), by Telligent Systems