Ajax & repeater: pagina lenta

mercoledì 07 gennaio 2009 - 11.44

paglio_go Profilo | Newbie

ciao a tutti,
in una pagina con 3 repeater annidati, inserita in un updatepanel di ajax, visualizzo una serie di record.
fino a quando non sono molti non c'è nessun problema, ma quando il numero delle righe cresce (100 ad esempio) al postback il ricaricamento della pagina è lentissimo e questa si blocca per diversi secondi, togliendo invece le 4 righe di codice ajax invece la pagina si aggiorna velocemente.
Avevo prima provato a disabilitare il viewstate (che in effeti è corposo) e poi a togliere i repeater annidati, ma il problema si presentava sempre

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<contenttemplate>
<table>
<!-- REPEATER 1 -->
<!-- REPEATER 2 -->
<!-- REPEATER 3 -->
</table>
</contenttemplate>
</asp:UpdatePanel>

qualcuno sa dirmi il motivo di tale rallentamento?

rossimarko Profilo | Guru

Ciao,

verifica il carico della cpu del tuo computer quando fai l'aggiornamento con ajax. Potrebbe essere un problema dovuto al fatto che la pagina viene ricostruita con il javascript.

Considera che è buona norma mantenere le procedure ajax snelle anche come mole di dati da gestire.. Potrebbero essere tanti fattori, una prima cosa da verificare è la cpu, poi la banda, ovvero quanti dati vengono inviati al server e quanti ne vengono ritornati. Per fare queste verifiche puoi usare questo tool: http://www.fiddlertool.com/fiddler/
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paglio_go Profilo | Newbie

grazie.
quel software non riesco ad usarlo che il firewall si incazza un attimo, cmq in quel lasso di tempo la cpu lavora al 50%..
evidentemente se come dici è consigliabile utilizzare procedure snelle con ajax il problema è li visto che l'attesa cresce esponenzialmente con l'aumentare dei dati nella pagina, peccato che sarebbe stato molto comodo.
Eventualmente è possibile utilizzare l'ajax solo per i repeater annidati e non in tutta la procedura? sto provando ma non sto riuscendoci

rossimarko Profilo | Guru

A cosa ti serve ajax? Hai delle operazioni che vengono fatte dentro al repeater? Si può pensare di cambiare un attimo la logica di funzionamento, però dipende da quello che viene fatto..
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paglio_go Profilo | Newbie

lo utilizzo solo x far vedere il caricamento della pagina (UpdatePanel)
in sostanza visualizzo una serie di record col primo repeater, e con i repeater annidati 2 e 3 visualizzo altri record di dettagli (al click di un bottone, così da effettuare la select solo sull'evento OnItemCommand)

dato repeater 1
- dato repeater 2
- dato repeater 3
dato repeater 1
- dato repeater 2
dato repeater 1
dato repeater 1

se già riuscissi ad utilizzare l'ajax solo per la visualizzazione dei repeater annidati sarebbe già un buon risultato e forse non sarebbe così pesante l'elaborazione

rossimarko Profilo | Guru

Allora se ho capito bene puoi provare a mettere un update panel nel repeater che visualizza il dettaglio al click del pulsante e aggancialo come AsyncPostBackTrigger (http://msdn.microsoft.com/it-it/library/system.web.ui.asyncpostbacktrigger.aspx) al pulsante.

<asp:UpdatePanel ID="updatePanel" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnEspandi" EventName="Click" />
</Triggers>
<ContentTemplate>
... repeater
</ContentTemplate>
</asp:UpdatePanel>
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paglio_go Profilo | Newbie

scusate se riprendo l'argomento dopo un po' di tempo..

impostando l'EventName del trigger="ItemCommand" ma da l'errore "Could not find an event named 'ItemCommand' on associated control 'Button1_R2' ".

ecco il codice:

<!-- REPEATER 1 -->
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="R1_ItemDataBound" OnItemCommand="R1_ItemCommand">
<!-- REPEATER 2 -->
<asp:Repeater ID="Repeater2" runat="server" OnItemCommand="R2_ItemCommand">
<ItemTemplate>
<asp:Button ID="Button1_R2" Text="+" runat="server" CommandName='open' CommandArgument='<%#Eval("UIDWQOPENITEMFC")%>' />
<asp:UpdatePanel ID="UP_R3" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<!-- REPEATER 3 -->
<asp:Repeater ID="Repeater3" runat="server">
</asp:Repeater>
<!-- REPEATER 3 FINE -->
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1_R2" EventName="ItemCommand" />
</Triggers>
</asp:UpdatePanel>
</ItemTemplate>
</asp:Repeater>
<!-- REPEATER 2 FINE -->
</ItemTemplate>
</asp:Repeater>
<!-- REPEATER 1 FINE -->

rossimarko Profilo | Guru

L'evento da agganciare ai bottoni è il click. Il problema è che il bottone è all'interno di un itemtemplate quindi non sarà visibile dall'updatepanel.

Puoi provare ad agganciare il trigger da codice
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paglio_go Profilo | Newbie

niente da fare, non si riesce ( o almeno non riesco io)
per caso hai una soluzione alternativa?
Ho provato ed effettuare subito tutte le select dei sottomenu ma in questo modo la pagina è naturalmente molto lenta nel carimento, e altre soluzioni per evitare il refresh della pagina non mi vengo no in mente.

rossimarko Profilo | Guru

Ciao,

crei un nuovo asynchpostbacktrigger per ogni pulsante della griglia?

Prova a guardare qua: http://forums.asp.net/p/1084113/1610124.aspx

Nel tuo caso invece che fare un ciclo su tutti gli item ti conviene farlo all'interno dell'evento ItemDataBound
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paglio_go Profilo | Newbie

grazie molto gentile, appena posso provo
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5