Question

J'ai un formulaire qui lance un Response.Redirect pour télécharger un fichier une fois terminé. Je souhaite également masquer le formulaire et afficher un panneau de remerciement avant la redirection. Toutefois, il semble que le moteur asp.net effectue la redirection sans effectuer les 2 tâches précédemment dans le code suivant:

if (success)
                {
                    lblSuccessMessage.Text = _successMessage;
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

                if(success)
                    Response.Redirect(_downloadURL); 

Avez-vous une idée de la façon dont je peux forcer la page à se mettre à jour avant que la redirection ne débute?

Merci beaucoup Greg

Était-ce utile?

La solution

if (success)
                {
                    lblSuccessMessage.Text = _successMessage;
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

                if(success) {
                    Threading.Thread.Sleep(200)
                    Response.Redirect(_downloadURL);
                }

Vous pouvez le forcer à attendre avant de rediriger en rendant le thread en veille.

La meilleure option, et la plus conviviale, consiste à laisser l'utilisateur continuer seul en ajoutant un bouton. Par exemple, vous pouvez procéder comme suit:

if (success)
                {
                    lblSuccessMessage.Text = _successMessage + "<br /><INPUT TYPE='button' VALUE='Continue...' onClick='parent.location='" + _downloadURL + "'/>";
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

Autres conseils

Vous avez besoin d'un code côté client pour effectuer la redirection.

Ma préférence serait d'intégrer du javascript pour faire la redirection.

Donc, masquez le formulaire, affichez le message et (au niveau le plus grossier) utilisez un contrôle littéral pour ajouter du texte comme celui-ci à la page.

<script>
    location.href = "http://otherServerName/fileToDownload";
</script>

Vous constaterez peut-être que cette redirection survient avant que votre page ne soit modifiée - dans ce cas, essayez ceci dans la balise body de votre code HTML (notez les différents types de guillemets):

<body onload='location.href="http://otherServerName/fileToDownload";'>

N'oubliez pas que chaque publication en arrière sert en réalité une nouvelle page au client, pas seulement en modifiant certaines propriétés de la page en cours (même si ASP.NET s'efforce de faire croire qu'il s'agit d'un formulaire Windows)

Personnellement, je préfère avoir une page distincte pour chaque étape du processus, plutôt que d'essayer de tout faire en une page en affichant / masquant les divers éléments - mais je pourrais être désespérément obsolète.

EDIT: s'ils ont désactivé javascript, vous pouvez simplement fournir un lien pour télécharger le fichier.

Vous ne pouvez pas, car cette action se produit sur le serveur avant d'être renvoyée au client. Si vous essayez d'envoyer un fichier à un utilisateur, vous pouvez le diffuser à l'aide de Response.Write (). Cela les gardera sur la page en cours afin que vous puissiez leur montrer le message et ils recevront l'invite de téléchargement.

tampon est un tableau d'octets d'un fichier

Response.AddHeader("Content-disposition", "attachment; filename=" & myUserFriendlyFileName)
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(buffer, 0, buffer.Length)

Vous ne pouvez pas faire cela directement dans asp.net, mais vous pouvez utiliser JS (comme indiqué ici) ou utiliser un IFrame qui charge le fichier à télécharger. L'utilisateur verra le , puis le dialogue Ouvrir / Enregistrer ...

Cachez-le côté client avec javascript, puis effectuez la redirection ou effectuez deux publications: la première publication pour masquer le formulaire et afficher le remerciement, et la seconde pour effectuer la redirection une fois que le remerciement a été rendu. l'écran.

Vous pouvez également créer une fenêtre javascript.open au lieu d'une redirection pointant vers la destination une fois la publication et le masquage du formulaire terminés.

Vous pouvez peut-être envoyer un en-tête de redirection manuellement, avec un délai d’attente de quelques secondes?

Response.AddHeader("Redirect", "3; URL=" + _downloadURL")

MODIFIER

Après avoir relu votre question, je vous ai peut-être mal compris.

Vous semblez vouloir retarder l’ensemble du processus de sorte qu’un "Merci" panneau peut être affiché. Cela vous laisse deux possibilités:

  • Soit vous utilisez JavaScript pour afficher le panneau et retarder le formulaire POST. Le serveur peut alors rediriger immédiatement avec Response.Redirect () . C’est la manière la plus moderne de le faire.
  • Ou vous voulez être totalement indépendant de JavaScript. Dans ce cas, vous devez faire en sorte que le serveur affiche une valeur intermédiaire " Merci, cliquez ici pour continuer " page sur le formulaire POST et utilisez la méthode d’en-tête de redirection via Response.AddHeader () pour que cette page disparaisse automatiquement. C’est un peu démodé mais fiable.

Vous ne pouvez pas vraiment combiner les deux, car cela serait incohérent pour les utilisateurs dont JavaScript est désactivé.

J'ai fini par faire la suggestion de abrudtkuh, en ajoutant simplement un lien au message de réussite ... j'implémenterai également une redirection javascript pour démarrer automatiquement le téléchargement, mais je ne voulais pas me fier uniquement à javascript. bouton affiché par la page.

Merci à tous pour les conseils - vous êtes tous rock!

acclamations greg

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top