Caricamento parziale asincrono di contenuti con il timer

mercoledì 29 agosto 2012 - 16.56
Tag Elenco Tags  VB.NET  |  .NET 3.5

zseven Profilo | Senior Member

Ciao ragazzi,
ho trovato in rete un esempio su come poter caricare in maniera asincrona dei contenuti di una pagina web.
L'ho testato e funziona perfettamente, l'unico problema lo riscontro all'atto del caricamento di questi contenuti.

In pratica quando vengono caricati il browser si sposta nuovamente sopra a tutto alla pagina, mentre io vorrei che questo caricamento fosse più "indolore".

Sapreste dirmi come posso fare?

Il codice che ho usato è questo:

<asp:Timer ID="Timer1" runat="server" Interval="1" OnTick="Timer1_Tick">
</asp:Timer>

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:UpdateProgress ID="ProgAjax" runat="server"> <ProgressTemplate> <div align="center"> <img src="/images/loading.gif" /> </div> </ProgressTemplate> </asp:UpdateProgress> <asp:Panel ID="PnlProva" runat="server" Visible="false"> 'QUI I CONTENUTI CARICATI </asp:Panel>

Nel code Behind questo:

Protected Sub Timer1_Tick(sender As Object, e As EventArgs) Timer1.Enabled = False Try PnlProva.Visible = True Catch PnlProva.Visible = False End Try End Sub

Grazie mille!

Gluck74 Profilo | Guru

bisognerebbe vedere il codice che hai trovato, per capire come funziona e quindi dove intervenire.

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Ciao Gluck,
grazie per la risposta.

Il codice che ho trovato è esattamente quello che vedi, l'unica differenza sta nel panel.
Nel codice invece di rendere visibile un panel impostava un text ad una label, poi il resto è tutto quello che vedi.

darkeric Profilo | Senior Member

il tuo problema è quello di memorizzare la posizione della scrollbar?

Programmatore per passione!

zseven Profilo | Senior Member

mmm... penso che se anche memorizzo la posizione della scrollbar, lui comunque prima ritorna all'inizio e poi dopo si sposta alla posizione in cui si trovava, giusto?

L'obiettivo è quello di non far risalire all'inizio della pagina la scrollbar.

Gluck74 Profilo | Guru

se il codice che hai postato è TUTTO quello che c'è, ti do una brutta notizia.....
non c'è un bel niente di asincrono!!!!!!!!!!!!!!!!!!!


____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Perdonami ma il panel all'interno di update template non è un contenuto asincrono?

zseven Profilo | Senior Member

Scusami ho visto che mancava un aparte nel codice iniziale.

Dopo la chiusura del Panel manca questo

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Gluck74 Profilo | Guru

ora potrebbe essere quasi giusto.
però dovresti spostare l'updateProgress, e dovresti metterlo al di fuori dell'updatePanel.

Io ipotizzo che dentro il Panel pnlProva ci sia qualcosa che carica dei dati, tipo una gridview con un datasource o qualcosa, e che il pannello sia contenuto nell'UpdatePanel, altrimenti il tutto non ha senso.

Nella direttiva @Page, metti la seguente proprietà:

MaintainScrollPositionOnPostback="true"

____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Allora ti riscrivo tutto il codice più ordinato:

<asp:Timer ID="Timer1" runat="server" Interval="1" OnTick="Timer1_Tick"> </asp:Timer> <asp:UpdateProgress ID="ProgAjax" runat="server"> <ProgressTemplate> <div align="center"> <img src="/images/loading.gif" /> </div> </ProgressTemplate> </asp:UpdateProgress> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:Panel ID="PnlProva" runat="server" Visible="false"> </asp:Panel> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" /> </Triggers> </asp:UpdatePanel>

All'interno del panel ci sono diverse operazioni che vengono richiamate o con funzioni, poi ci sono un paio di repeater.

Ho fatto come mi hai detto ma continua a risalire.
Considera che questo codice è in una master, e qui ovviamente non ho potuto mettere la direttiva, così l'ho provato sulla page che vado a caricare, anche se il codice non è presente qui, ma continua a non funzionare.

Gluck74 Profilo | Guru

mi pare strano che ora la pagina torni in cima.

Per caso richiami l'update del pannello da codice? (non serve se hai il time come trigger)
togli "updatemode=conditional" dall'updatePanel



____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

niente purtroppo... no nel code c'è solo il timer_tick.

Guarda puoi controllare come si comporta online qui
http://wine.guidozagarola.com/default.aspx

E' la colonna di destra che sta all'interno del Panel.

Gluck74 Profilo | Guru

a me la pagina non si muove di un millimetro, ma in verità mi sembra che non si aggiorna proprio!!!!!!!!!!!!!!

io vedo 2 updatepanle
uno si chiama UpdtAjax, l'altro UpdatePanel1

Il secondo è vuoto!!!!!

c'è qualcosa che non va
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Allora se come carichi la pagina muovi la rotellina verso il basso vedrai che verrai subito riportato all'inizio.
Anche cliccando su Home come se stessi navigando puoi fare la stessa prova. Avendo pochi dati da caricare adesso risulta brevissimo il caricamento e se non ti sposti subito non vedi che vieni riportato sopra.

Per quanto riguarda il codice non vedi nulla nel panel perchè viene caricato in maniera asincrona, quindi è logico che nell'html non venga visualizzato in quanto questo viene generato all'atto del caricamente della pagina, e non del richiamo del panel asincrono.

La struttura è comunque la seguente:

c'è una prima Master all'interno della quale c'è un updatepanel che si chiama updajax.
All'interno c'è una seconda Master collegata alla prima, e qui dentro c'è l'updatePanel1 che è quello che contiene il Panel che viene caricato in maniera asincrona.

Ho provato anche mettendo maintainScrollPositionOnPostBack nel web.config, ma ancora niente, vengo sempre sbattuto in alto...

Gluck74 Profilo | Guru

ok, ho visto
si muove appena ha finito di caricare (probabile che quindi lo faccia una volta sola????? anzi, sono sicuro, lo fa una volta sola)

Controllando il contenuto che viene rigenerato dal updatepanel (che riporto in parte), mi sono accorto che è quello della masterpage ad essere rigenerato.
Ecco perché non ti funziona.
Dovresti mettere updatemode=conditional al panel della masterpage, e lasciare il trigger al panel dell'altra pagina.

ma come mai 2 updatepanel uno dentro l'altro?

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Grazie mille per la pazienza e l'aiuto, ma purtroppo ancora niente...

Ho fatto come mi hai detto:

Sul primo update presente sulla prima Master ho messo il Conditional
<asp:UpdatePanel ID="UpdtAjax" runat="server" UpdateMode="Conditional">

Sulla seconda Master ho lasciato il trigger, ed ho provato sia mantenendo il secondo updatepanel, sia togliendolo.
Ne avevo messi due perchè credevo che non poteva mettere il trigger senza inserire un altro update.
In entrmabi i casi comunque non funziona.

Ho anche aggiunto come ti ho detto la dicitura
MaintainScrollPositionOnPostback sia sulla Default che sul web.config

Provandolo in locale il caricamento del lato destro è più lento e mi accorgo meglio che la scrollbar risale senza dover fare le corse con la scrollbar...

Dove può essere l'errore...
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