2010-02-01 10 views
16

Betrachten Sie das Szenario:Was passiert, wenn ich den Browser ZURÜCK-Taste drücke?

  1. ich eine Seite einer Website besucht ASP.NET gebaut werden. Die Seite ist eine einfache Aspx-Seite mit ASP.NET-Serversteuerelementen.

  2. Ich klickte auf einen Link, der mich zu einer anderen Seite auf der gleichen Website führt.

  3. Ich klickte die ZURÜCK Schaltfläche des Browsers.

FRAGE: Was in Bezug auf die Seite Lebenszyklus passiert? Treten alle Ereignisse auf oder zeigt der Browser nur die zwischengespeicherte Version der Seite an, ohne irgendwelche Anforderungen zu stellen?

Antwort

15

Ich denke die beste Antwort ist: Es hängt vom Browser ab, besonders nach einem Post/Postback.

In älteren Browsern wird ein Bestätigungsdialog mit der Meldung "die Seite enthält POST-Daten, die erneut übermittelt werden" angezeigt, und Sie können entweder fortfahren (erneut senden) oder abbrechen. Da alles, was in ASP.NET-WebForms passiert, Teil des Elements (ViewState, Ereignisse usw.) ist, würde dies dazu führen, dass sich der gesamte Lebenszyklus wiederholt.

Natürlich verursachte dies kein Ende der Probleme mit doppelten Übermittlungen, so viele Websites mussten mit Workarounds für die Dupe-Problem zu kommen, und heute die meisten Browser nur holen Sie die Seite aus dem Cache statt.

... Das ist , es sei denn, überschreiben Sie die Cache-Steuerelementheader und zwingen den Browser, die Seite nicht im Cache zu speichern. Offensichtlich kann es in diesem Fall nicht aus dem Cache abgerufen werden, so dass es normalerweise erneut übergeben wird. Aber, wieder, es hängt vom Browser ab - zum Beispiel, einige Browser erlauben die Wiederübermittlung über SSL nicht, also wenn das Protokoll verwendet wird, dann sieht der Benutzer nur eine Nachricht, die besagt, dass die Seite abgelaufen ist/nicht sein kann gezeigt.

Kommen wir mal auf die Frage, wahrscheinlich ist eine noch bessere Antwort: Als Websitedesigner können Sie sich beim Klicken auf Zurück nicht wirklich auf ein bestimmtes Verhalten des Browsers des Benutzers verlassen. Wenn eine doppelte Einreichung negative Auswirkungen haben könnte (z. B. zweimaliges Aufladen einer Kreditkarte), müssen Sie angemessene Maßnahmen ergreifen, um dies zu verhindern. Es ist trotzdem eine gute Übung, da es für einen Benutzer durchaus möglich ist, einfach per Zufall auf den "Senden" -Button zu doppelklicken.

+0

Ich stimme Aaronaught's Antwort zu. Ich würde nicht versuchen, irgendeinen Code zu schreiben, der davon ausgeht, dass sich die Schaltfläche "Zurück" in allen Browsern auf eine bestimmte Art und Weise verhält. – jessegavin

+0

Ich glaube, Sie haben ein anderes Szenario in Betracht gezogen, die gleiche Seite mit einem Steuerelement zu sichern und dann die BACK-Taste zu drücken ... Bin ich richtig? – Manish

+0

@Manish: Was zählt, ist nicht notwendigerweise, ob die * gegenwärtige * Seite des Benutzers 'POST'-Daten hat oder nicht, aber ob die * vorherige * Seite (diejenige, die die Zurück-Schaltfläche dazu bringt), hatte' POST'-Daten . Das schließt beide Szenarien ein - Zurückgehen von einem Postback und Zurückgehen von einer neuen Seite, wenn die vorherige Seite ein Postback (oder nur "POST") hatte. – Aaronaught

0

in der Regel alle Ereignisse auftreten sollte, aber wenn Sie einen uber Browser haben, als es eine zwischengespeicherte Seite anzuzeigen Sie können nur setzen einen Haltepunkt in Ihrem Laden der Seite passieren könnte und sehen, ob es

0
auftreten los

Die Seite wird aus dem Cache angezeigt.

+0

So zu lösen, wenn ich Response.Cache.SetCacheability (HttpCacheability.NoCache) gesetzt haben, würde zurückschlagen der Browser eine zur Ausgabe von Get Anfrage für die Provious-Seite, oder vielleicht sogar ein Postback, wenn das die letzte Aktion des Users war? – AaronLS

+0

Ja würde es Postback, wenn Sie Response.Cache haben.SetCacheability (NoCache) festgelegt, aber für einige Seiten werden Sie den gleichen Inhalt sehen. Versuchen Sie mit Response.Cache.SetCacheability (HttpCacheability.NoCache); Response.Cache.SetExpires (DateTime.Now-new TimeSpan (1,0,0)); Response.Cache.SetLastModified (DateTime.Now); Response.Cache.SetAllowResponseInBrowserHistory (false); – Ravia

+0

Ich denke, Sie würden eine "Seite abgelaufen" Hinweis anstelle der Seite bekommen, aber ich denke, es hängt immer noch vom Browser ab. – Codesleuth

1

haben wir versucht, auch

Response.ExpiresAbsolute = DateTime.Parse("1/1/1980"); 
Response.AddHeader("cache-control", "no-store, must-revalidate, private"); 
Response.AddHeader("Pragma", "no-cache"); 

diese Art von Problem

Verwandte Themen