2009-12-18 3 views
4

J'ai une simple application C# ASP.NET qui génère un fichier Excel et l'envoie au navigateur en utilisant la fonction Response.WriteFile().Comment puis-je modifier une page après le téléchargement d'un fichier dans le navigateur?

Je voudrais désactiver le bouton d'envoi une fois qu'il a été cliqué et affiche un message sur l'écran d'attendre quelques minutes, car certains des fichiers peut prendre un certain temps pour générer. Cela fonctionne très bien, mais je n'arrive pas à comprendre comment réactiver le bouton, ou même actualiser la page, une fois le téléchargement du fichier terminé. La page reste dans un état désactivé, "Please wait ..." même quand c'est fini.

Je pensais un appel AJAX synchrone avec les commandes supplémentaires javascript serait ensuite travailler, mais bien que le fichier ne soit généré, il n'a jamais envoyé au navigateur. J'ai également essayé d'utiliser un contrôle iframe, mais je ne trouve aucun moyen de savoir de façon fiable quand un nouveau fichier est chargé à l'intérieur.

Merci d'avance à tous ceux qui peuvent vous aider! MISE À JOUR: J'ai trouvé une solution possible au http://code.msdn.microsoft.com/AjaxFileDownload qui fonctionne très bien pour le téléchargement de fichiers qui existent déjà, mais quand j'appelle une page qui génère le fichier et finit avec Response.End(), l'événement "Finished Downloading" ne se déclenche jamais .

+1

vous ne pouvez pas savoir via javascript lorsque le fichier est "le téléchargement terminé". C'est en haut faire le navigateur. En ce qui concerne le «fait de générer» le serveur, la solution de Stephen est assez juste. –

+0

Essayez quelque chose comme [this] (http://stackoverflow.com/a/4168965/585552) – Greg

Répondre

4

La façon dont je le faire est que j'aurais la page générer un jeton, et envoyer ledit jeton au serveur en même temps que la demande pour générer le fichier Excel.

Lorsque le serveur reçoit le jeton, il le jette dans une table dans votre base de données, et une fois que le fichier a fini d'être servi, il supprime le jeton.

Maintenant, tout ce qui se passe, avoir un processus sur la page qui routine (regardez dans JS Timers) demande au serveur (appels asynchrones) si le jeton existe dans la base de données. quand le serveur dit finalement à la page "non" alors vous savez que vous pouvez réactiver la page et cacher le message "Please Wait ...".

+1

C'est une solution intéressante, mais cela demande beaucoup de travail et de frais généraux pour une amélioration mineure de l'interface utilisateur. –

+0

IMO, avec la tâche décrite, ce sera la solution la plus simple à mettre en œuvre avec le moins de changements possible. –

+0

Stephen, je sais que vous avez répondu il y a des années, mais comment proposez-vous que nous reconnaissons cet événement: "une fois que le fichier a fini d'être servi" –

0

Je serais probablement tourner votre code qui génère et retourne le fichier dans un jquery de service et l'utilisation web ou asp.net ajax bibliothèque pour faire l'appel ... avec jquery il ressemblerait à quelque chose comme:

//open your dialog box here 

puis

$.ajax({ 
    type: "POST", 
    url: "yourwebservice.asmx", 
    data: "yourdata", 
    success: function(){ 
    //close your dialog box 
    } 
}); 
1

MISE à JOUR: J'ai trouvé une solution à http://code.msdn.microsoft.com/AjaxFileDownload qui fonctionne très bien pour le téléchargement de fichiers qui existent déjà, mais quand je l'appelle une page qui génère le fichier et se termine par Response.End(), le "Terminé Téléchargement" événement ne tire jamais.

Il ne prend pas en charge les téléchargements de flux. Vous devez créer un fichier temporaire et pousser le fichier temporaire vers le navigateur, espérons que cela vous aidera à gérer les fichiers générés. L'événement de fin de téléchargement sera déclenché uniquement si une valeur de cookie est disponible du côté du navigateur.

Merci,

Raj

Questions connexes