asp.net verhindert zweimal die Einreichung des Formulars

8

Ich habe eine Webformular-Webanwendung (asp.net 2.0). Wenn der Benutzer das Formular abschickt, wird der Link zum Absenden der E-Mail tatsächlich gelöscht und kann nicht erneut gesendet werden. Sie könnten jedoch F5 drücken, und das verursacht ein weiteres Einfügen in die Datenbank, was nicht passieren soll.

Gibt es eine Art von Einstellung, die ich einstellen kann, wenn sie F5 drücken, um die Seite zu sagen - nicht erneut senden?

    
d3020 26.03.2010, 20:37
quelle

4 Antworten

13

Es hört sich so an, als würden Sie ein Postback auf dieselbe Seite machen und dann in eine Datenbank einfügen, bevor Sie die gleiche Seite für den Benutzer erneut anzeigen, ohne die Schaltfläche zum Absenden?

Wenn dies der Fall ist, ist es am einfachsten, ein Response.Redirect() auf dieselbe Seite zu setzen - wenn der Benutzer also F5 drückt, wird die GET-Anfrage erneut auf die Seite geladen, anstatt auf den POST.

Erklärung:

Wenn Sie in ASP.NET ein Postback ausführen, sendet der Browser eine POST-Anforderung an den Server . Ich kenne Ihren Hintergrund in HTTP-Methoden nicht, aber selbst wenn Sie neu in der Web-Programmierung sind, haben Sie wahrscheinlich die Auswirkungen dieser Art von Anfragen in Browsern erfahren. Wenn Sie Formulare auf Websites einreichen und die Zurück-Schaltfläche drücken, wird manchmal etwas wie "Möchten Sie die Formulardaten erneut einreichen" angezeigt. Dies liegt daran, dass diese Formulare Daten mithilfe der HTTP-POST-Methode an den Server senden. Die Wirkung der Zurück-Taste ist in diesem Fall die gleiche wie wenn Sie F5 drücken - der Browser wiederholt genau die gleiche POST-Anfrage erneut (was einige Arten von Formulardaten erfordert, und in diesen Fällen sind es dieselben Daten, die Sie zuletzt übermittelt haben) Zeit).

Wenn Sie Response.Redirect() verwenden, gibt der Server als Antwort auf den HTTP-Statuscode 302 aus (Ressource wurde vorübergehend verschoben) die Anfrage. Der Browser gibt dann eine GET-Anfrage für die Ressource aus, zu der er angewiesen wurde, umzurechnen (in diesem Fall die gleiche Seite).

Jetzt, wenn Sie auf der Seite sind, wird es zurückgegeben, als ob Sie es über einen Link besucht oder direkt in die Adresszeile eingegeben hätten. Wenn Sie diesmal F5 drücken, wird eine GET-Anforderung im Gegensatz zu einem POST ausgegeben.

Ich würde Ihnen empfehlen, Firebug herunterzuladen und das "Net" -Panel zu aktivieren. Sie können genau sehen, was eine Anfrage / Antwort zusammen mit einer Liste aller Anfragen auf Ihrer Seite erstellt.

Weitere Ressourcen:

Wenn Sie abenteuerlustig sind, können Sie sich noch mehr Statuscodes ansehen (und übrigens habe ich auch tatsächlich verwendet 418 in einer Anwendung, an der ich als Hack arbeite, um die Formularauthentifizierung für ASP.NET zu umgehen.

Wenn Firebug nicht genug ist, kannst du Fiddler herunterladen und nach deinen Wünschen selbst Hand anlegen und nachspielen.

>

Wenn GET und POST nicht genug für Sie sind, können Sie andere Methoden verwenden, um die Zustände in Ihrer Anwendung zu ändern. Sie haben vielleicht schon von RESTful-Architektur gehört, die grundsätzlich die HTTP-Methoden GET, PUT, POST und DELETE verwendet, wie sie vorgesehen waren .

    
John Rasch 26.03.2010 21:15
quelle
5

Du könntest das versuchen. Wenn es nicht Ihren Bedürfnissen entspricht, ist es zumindest gut zu wissen.

Post - Redirect - Get

Ссылка

    
Steve 26.03.2010 23:16
quelle
0

Sie können mehrere Dinge tun. Speichere einen Boolean in ViewState. Überprüfen / setzen Sie die Eigenschaft. Speichere den Boolean in Session und überprüfe / setze ihn.

Beim Postback setzen Sie den Wert und wenn der Wert wahr ist, verhindern Sie die Einreichung und erhöhen / zeigen Sie einen Fehler an.

    
Raj Kaimal 26.03.2010 20:40
quelle
0

Es gab einen sehr aktuellen Artikel über Code Project , der eine Möglichkeit bot, unerwünschte Aktualisierungen mithilfe von zu behandeln ein HttpModule, ein verstecktes Feld und etwas JavaScript. Es ist vielleicht nicht richtig für Sie, aber es ist eine raffinierte Lösung, die nicht auf ViewState oder Session beruht.

    
300 baud 26.03.2010 21:18
quelle

Tags und Links