267 votes

Afficher les messages des projets?

Nous avons l'obligation de prendre une forme de soumission et d'enregistrer certaines données, puis de rediriger l'utilisateur vers une page hors site, mais dans la redirection, nous avons besoin de le "soumettre" une forme de POST, pas.

J'espérais qu'il y a un moyen facile de ce faire, mais je commence à penser que il n'y en a pas. Je pense que je dois maintenant créer une autre page, avec juste la forme que je veux, rediriger, remplir le formulaire de variables, puis faire un corps.onload appel à un script qui appelle simplement le document.forms[0].submit();

Quelqu'un peut me dire si il y a une alternative? Nous pourrions avoir besoin d'ajuster cette plus tard dans le projet, et il peut être sorte de compliqué, donc si il a été facile que nous pourrions le faire tous les non-autres page dépendante, ce serait merveilleux.

De toute façon, merci pour tout et à toutes les réponses.

231voto

tghw Points 14244

Ce faisant, il faut comprendre comment les redirections HTTP travail. Lorsque vous utilisez Response.Redirect(), de vous envoyer une réponse (pour le navigateur qui fait la demande), avec le Code d'État HTTP 302, qui indique au navigateur où aller. Par définition, le navigateur va faire que par l'intermédiaire d'un GET la demande, même si la demande originale a été un POST.

Une autre option est d'utiliser le Code d'État HTTP 307, qui spécifie que le navigateur doit faire la demande de redirection de la même façon que l'original de la demande, mais pour demander à l'utilisateur un avertissement de sécurité. Pour ce faire, vous devez écrire quelque chose comme ceci:

public void PageLoad(object sender, EventArgs e)
{
    // Process the post on your side   

    Response.Status = "307 Temporary Redirect";
    Response.AddHeader("Location", "http://example.com/page/to/post.to");
}

Malheureusement, cela ne fonctionne pas toujours. Les différents navigateurs de mettre en œuvre de façon différente, car il n'est pas un code d'état.

Hélas, à la différence de l'Opéra et des développeurs de FireFox, IE les développeurs n'ont jamais lu la spec, et même la dernière, la plus sécurisée IE7 va rediriger la requête POST de domaine A domaine B, sans que les avertissements ou les boîtes de dialogue de confirmation! Safari agit également de façon intéressante, même si elle ne suscite pas une boîte de dialogue de confirmation et effectue la redirection, il jette les données POST, effectivement changer 307 rediriger dans le plus commun 302.

Donc, autant que je sache, la seule façon de mettre en œuvre quelque chose qui serait à l'utilisation de Javascript. Il y a deux options que je peux penser à du haut de ma tête:

  1. Créer le formulaire et c'est action de l'attribut pointer vers le serveur tiers. Ensuite, ajoutez un événement click pour le bouton submit qui exécute pour la première fois une requête AJAX à votre serveur avec les données, et permet ensuite le formulaire pour être soumis au serveur tiers.
  2. Créer le formulaire à poster sur votre serveur. Lorsque le formulaire est soumis, montrer à l'utilisateur une page qui contient un formulaire avec toutes les données que vous souhaitez passer, toutes cachées dans les entrées. Juste afficher un message du genre "Redirection...". Ensuite, ajoutez un événement javascript de la page qui envoie le formulaire au serveur tiers.

De deux, je choisirais la deuxième, pour deux raisons. Tout d'abord, il est plus fiable que la première parce que le Javascript n'est pas nécessaire pour qu'il fonctionne; pour ceux qui ne l'ont pas activé, vous pouvez toujours vous rendre sur le bouton soumettre pour la forme cachée visible, et de lui demander de presse si cela prend plus de 5 secondes. Ensuite, vous pouvez décider quelles données sont transmises au serveur tiers; si vous utilisez seulement le processus de la forme qu'il se passe, vous serez en passant le long de toutes les données post, qui n'est pas toujours ce que vous voulez. De même pour la 307 solution, en supposant qu'il a travaillé pour tous vos utilisateurs.

Espérons que cette aide!

131voto

Pavlo Neyman Points 3100

Vous pouvez utiliser cette approche:

Response.Clear();

StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
sb.AppendFormat("<form name='form' action='{0}' method='post'>",postbackUrl);
sb.AppendFormat("<input type='hidden' name='id' value='{0}'>", id);
// Other params go here
sb.Append("</form>");
sb.Append("</body>");
sb.Append("</html>");

Response.Write(sb.ToString());

Response.End();

Comme résultat une fois que le client pourra obtenir tous html à partir du serveur de l'événement onload de prendre la place qui déclenche soumettre le formulaire et de valider toutes les données définies postbackUrl.

33voto

FlySwat Points 61945

HttpWebRequest est utilisé pour cela.

Sur la publication, créer un HttpWebRequest au tiers et d'afficher les données de formulaire, puis une fois que c'est fait, vous pouvez la Réponse.Rediriger où vous le souhaitez.

Vous obtenez l'avantage supplémentaire que vous n'avez pas de nom de toutes vos commandes de serveur pour faire de la 3e parties du formulaire, vous pouvez le faire de la traduction lors de la construction de la POST-chaîne.

string url = "3rd Party Url";

StringBuilder postData = new StringBuilder();

postData.Append("first_name=" + HttpUtility.UrlEncode(txtFirstName.Text) + "&");
postData.Append("last_name=" + HttpUtility.UrlEncode(txtLastName.Text));

//ETC for all Form Elements

// Now to Send Data.
StreamWriter writer = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";                        
request.ContentLength = postData.ToString().Length;
try
{
    writer = new StreamWriter(request.GetRequestStream());
    writer.Write(postData.ToString());
}
finally
{
    if (writer != null)
        writer.Close();
}

Response.Redirect("NewPage");

Toutefois, si vous avez besoin de l'utilisateur pour voir la page de réponse à partir de ce formulaire, votre seule option est d'utiliser le Serveur.De transfert, et qui peuvent ou peuvent ne pas fonctionner.

7voto

ZooZ Points 100

Cela devrait rendre la vie beaucoup plus facile. Vous pouvez simplement utiliser la Réponse.RedirectWithData(...) la méthode dans votre application web facilement.

Imports System.Web
Imports System.Runtime.CompilerServices

Module WebExtensions

    <Extension()> _
    Public Sub RedirectWithData(ByRef aThis As HttpResponse, ByVal aDestination As String, _
                                ByVal aData As NameValueCollection)
        aThis.Clear()
        Dim sb As StringBuilder = New StringBuilder()

        sb.Append("<html>")
        sb.AppendFormat("<body onload='document.forms[""form""].submit()'>")
        sb.AppendFormat("<form name='form' action='{0}' method='post'>", aDestination)

        For Each key As String In aData
            sb.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", key, aData(key))
        Next

        sb.Append("</form>")
        sb.Append("</body>")
        sb.Append("</html>")

        aThis.Write(sb.ToString())

        aThis.End()
    End Sub

End Module

3voto

Jimmy Points 35501

PostbackUrl peut être mis sur votre asp bouton poster sur une autre page.

si vous avez besoin de le faire dans le code-behind, essayez de Serveur.De transfert.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X