Frage

ich eine Web-Seite, die E-Mail an mehrere Benutzer sendet (Online-Verteilerliste). Nach dem Absenden-Button geklickt wird und die E-Mail gesendet wird, wird eine Statusseite Liste gezeigt, wie viele E-Mails wurden Fehler gesendet, und andere Informationen. Wenn der Benutzer die Zurück-Schaltfläche klickt, ist die E-Mail erneut gesendet. Wie kann ich das verhindern?

Hinweis: Der Browser muss der Benutzer-Eingabeaufforderung „Erneut senden“ oder „resend“ Daten auf die Seite, bevor sie tatsächlich die E-Mail zu senden, aber das ist noch nicht meine Benutzer darauf klicken und dann fragen, warum zwei Kopien der E-Mail abgeschickt waren aus.

Umwelt:

  • Server: C #, ASP.NET 2.0, IIS 6
  • Client: jeder Browser (Ich möchte nicht eine IE-spezifische Lösung wie Smartnavigation)
War es hilfreich?

Lösung

In Ihrem Code, direkt nach dem Punkt, wo E-Mails gesendet werden, führen Sie eine 302-Umleitung auf eine Bestätigungsseite:

protected void btnSend_Click(object sender, EventArgs e)
{
    SendManyEmails();
    Response.Redirect("confirmation.aspx");
}

Mit dieser Art von Code, der POST auf die Originalseite nicht im Browserverlauf am Ende.

Dieses gemeinsame Muster ist bekannt als der Pfosten- / Redirect / Get Muster .

Bonus Informationen über Zustand zu halten, wenn tun Pfosten- / Redirect / Get

Der Hauptnachteil dieses Musters ist, dass alle Zustand aus dem Umgang mit der POST-Anfrage geht verloren, wenn der Benutzer umgeleitet - also die Aufnahme einen neuen Anforderungskontextes. In ASP.NET enthält diese Mitglieder im Page und alle Control Objekte, sowie alles, was in der ViewState gespeichert.

Wenn Sie irgendeine Art von „Statusobjekt“ erzeugen - vielleicht ein Protokoll der gesendeten Mail-Nachrichten - während der Anforderung POST Handhabung, werden Sie eine Möglichkeit brauchen dieses Objekt für die folgende GET-Anfrage zu speichern. Einige Web-Frameworks hat Funktionalität speziell dafür: RoR hat flash, ASP.NET MVC hat TempData. ASP.NET-Formulare hat kein solches Konzept integriert, so dass Sie Figur etwas aus sich selbst haben wird.

Speichern des Objekts an den Session auf der POST, Lesen und es auf den folgenden GET Löschen wäre ein Weg, dies zu lösen. Sie können eine Abstraktion, um dieses bauen, wenn Sie es an mehreren Orten verwenden, oder Sie können das Web für bestehende Implementierungen von Flash / TempData für ASP.NET Formen suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top