2009-09-29 7 views
1

Parfois, ma requête ajax est si rapide que l'utilisateur ne réalise pas qu'un appel ajax a été effectué. Donc, je voudrais forcer le contrôle UpdateProgress à afficher pour un minimum de temps, même si la requête ajax a été finie.ASP.NET Ajax Afficher le contrôle UpdateProgress pendant un laps de temps minimum

Par exemple:

John broute le site et l'appel ajax prend 2 secondes. Je veux seulement que le contrôle UpdateProgress s'affiche pendant ces 2 secondes. Mary parcourt également le site, mais l'appel ajax prend> 0,5 secondes. Je veux donc afficher le contrôle UpdateProgress pendant au moins 1 seconde complète.

Est-ce que quelqu'un a des idées sur la façon de le faire?

Modifier

J'ai découvert que le contrôle AjaxLoadingPanel offert par Telerik a cette capacité. Il a une propriété appelée MinDisplayTime qui fait exactement cela. Il serait bon de savoir comment faire cela en utilisant les contrôles ajax standards (gratuits) asp.net.

Merci

+0

Est-ce que quelqu'un d'autre a des idées? – Douglas

Répondre

0
protected void Button1_Click(object sender, EventArgs e) 
{ 
    System.Threading.Thread.Sleep(3000); 
    Label1.Text = DateTime.Now.ToString(); 
} 

http://www.asp.net/Ajax/Documentation/Live/tutorials/ProgrammingUpdateProgress.aspx

+0

Salut - Le problème avec cette solution est que j'ajouterais 3 secondes supplémentaires même si l'appel Ajax a déjà pris 2 secondes pour s'exécuter. Je souhaite uniquement afficher le contrôle UpdateProgress pendant une période plus longue * SI * l'appel Ajax a pris moins d'une certaine durée. – Douglas

1

J'ai eu le même problème de travail sur un site intranet où les UpdatePanel contenu a changé si vite que je ne pouvais pas dire si une mise à jour était arrivé sans débogage, ou le contrôle la base de données.

La façon dont j'ai abordé ce problème était de laisser le UpdatePanel faire comme avant, mais utiliser un UpdatePanelAnimationExtender pour faire brièvement clignoter un changement de couleur de fond, par exemple, avant de revenir à la normale, donnant à l'utilisateur l'impression qu'un l'action est arrivée. Si cela se produit rapidement, par exemple 0,3 seconde, et qu'une couleur d'action appropriée est choisie, cela peut être très efficace.

<ajaxToolkit:UpdatePanelAnimationExtender ID="myUpdatePanelExtender" runat="server" TargetControlID="myUpdatePanel"> 
    <Animations> 
     <OnUpdating> ... </OnUpdating> 
     <OnUpdated> ... </OnUpdated> 
    </Animations> 
</ajaxToolkit:UpdatePanelAnimationExtender> 

Vous aurez besoin d'obtenir le AJAX Control Toolkit, mais si vous faites Asp.Net travail AJAX, vous serez mieux l'avoir, si vous ne le faites pas déjà. Pour savoir quoi placer dans la balise <OnUpdating> etc., consultez la page du site de la boîte à outils Asp.Net Ajax Control 'Using Animations'.

+0

+1 N'a pas pensé à utiliser le UpdatePanelAnimationExtender avant. Bien qu'il ne résout pas le problème particulier décrit ci-dessus, il fournit une autre option dans la façon dont je préviens l'utilisateur que quelque chose s'est passé. – Douglas

+0

Vous avez bien sûr raison: c'est plus une solution latérale à votre problème.Mais il a d'autres avantages, tels que: s'il y a plusieurs petites régions de mise à jour sur la page qui sont affectées par un bouton ou un contrôle, elles peuvent ne pas être remarquées par l'utilisateur si la page est occupée. Une petite rafale de couleur, qui s'estompe après 0,5 seconde, les avertit de tout changement d'état sur la page –

0

vous pouvez travailler autour de ce dernier en gardant la trace du temps, votre code côté serveur prend pour exécuter (ou peut-être encore mieux en mesurant le temps d'exécution ajax, mais qui est plus difficile)

l'idée est

long startTime = System.DateTime.Now.Ticks; 
//this process can take some time, especially when executed for the first time 
//it gets data and binds it to a control 
FetchData(); 
//if this takes not enough time, add an extra second to allow the UpdateProgress to display 
if (TimeSpan.FromTicks(DateTime.Now.Ticks - startTime).TotalSeconds < 1) 
      System.Threading.Thread.Sleep(1000); 
Questions connexes