2012-03-19 14 views
6

Mam problem z prostą aplikacją ASP.NET i przyciskiem Wstecz po wysłaniu z powrotem.Przeglądarka ASP.NET pokazuje "strona internetowa wygasła" dla przycisku wstecz (po przesłaniu)

Strona, której dotyczy pytanie, zawiera prosty formularz, niektóre pola tekstowe itp. Oraz menu rozwijane z funkcją odświeżania wstecznego (autoprotbacku).

"Normalny" przepływ to użytkownik wypełniający formularz i może zmienić listę rozwijaną. Na podstawie wartości rozwijanej zawartość strony może się zmienić.

Problem polegający na tym, że po zmianie przez użytkownika listy rozwijanej i zakończeniu odświeżenia strony użytkownik kliknie przycisk Wstecz. Widzą komunikat "Strona wygasła" z IE.

mam ustawić:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.Private); 

Ale to nie wydaje się być przybity problem.

Rzeczywista nagłówka odpowiedzi Cache-Control brzmi: prywatnym, no-cache: "Set-Cookie"

W klasycznych aplikacji ASP na z nagłówka odpowiedzi Cache-Control zaledwie "prywatnej" przycisku Wstecz zachowuje się zgodnie z oczekiwaniami po "odesłaniu".

Czy mimo to należy wymusić na programie ASP.NET ustawienie kontroli pamięci podręcznej na dokładnie "prywatne"? Lub inne rozwiązanie, które powoduje, że przycisk wstecz i postbacks działają dobrze razem?

Dzięki!

Odpowiedz

1

To, z czym masz do czynienia, to w rzeczywistości stary problem. Zasadniczo powodem, dla którego widzisz komunikat "Strona wygasła" jest użycie jednej z technik wyłączania przycisku "wstecz". Technika ustawia pamięć podręczną na datę w przeszłości, co powoduje, że przeglądarka wyświetla ten błąd, jeśli użytkownik kliknie przycisk "Wstecz".

To byłaby ta linia kodu:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 

To był problem, zwłaszcza z WebForms ASP.NET, ponieważ, jak działa odświeżenie strony, w porównaniu do innych ram.

W celu dokładnego wyjaśnienia wszystkich związanych z tym kwestii, zdecydowanie zalecamy przeczytanie artykułu powiązanego z poniższym. Nie odpowiada bezpośrednio na twoje pytanie, ale myślę, że dostaniesz więcej informacji niż prosta odpowiedź i pomoże ci przemyśleć swoje opcje, uzbrojone w lepsze zrozumienie problemu. Koniecznie przeczytaj części 1 i 2.

http://www.4guysfromrolla.com/webtech/111500-1.shtml

mam pomysł jak zrobić przycisk „wstecz” zachowywać się jak przycisk „back” ponownie, tak że postbacks nie są traktowane jako nawigacja strony:

Osobiście zastosowałem (prawdopodobnie hackowe/niechlujne) podejście do umieszczania rzeczy w panelu UpdatePanel, gdy nie chcę konfliktu przycisku postbacl/back, ponieważ używam Ajaxa w większości moich aplikacji tak czy inaczej. Zmusza to przycisk "wstecz" do powrotu do poprzedniej strony zamiast do zapisywania na tej samej stronie, ale powraca do wartości kontrolnych, tak jak przed oddzwonieniem.

+0

nie ma sensu do mnie, że to klasyczna aplikacja ASP, który wyznacza wygaśnięcie -1 minutę, cache-control prywatny pozwala tył Przycisk działa "zgodnie z oczekiwaniami", ale aplikacja ASP.NET z wygasaniem ustawionym na -1 minuta i ustawieniem kontroli pamięci podręcznej na "prywatny, bez pamięci podręcznej: ustaw plik cookie" nie działa. Wydaje mi się, że jest to problem "no-cache: set cookie". – user505765

+0

Rozumiem. Różnica polega na tym, że klasyczna ASP nie ma post-backs do walki. Kliknięcie przycisku uruchamia "Akcja" formularza, a za każdym razem jest to całkiem nowa strona. W ASP.NET, jeśli zmienisz listę rozwijaną, a ta lista rozwijana ma "autopostback" ustawiona na wartość true, przeglądarka faktycznie widzi to jako nawigację do nowej strony. Wszystko zależy od tego, w jaki sposób realizowane są postbacks, które są stałym źródłem irtritacji w takich przypadkach. Techniczna zmiana zestawu rozwijanego dla autompostbacku powoduje wyzwolenie opcji "post" w formularzu, ale paradygmat WebForms rozmywa go ... – David

+0

Może to lepsze wyjaśnienie - do przeglądarki każde odświeżenie jest w rzeczywistości nową wizytówką strony, a jest przechowywany w historii, mimo że paradygmat WebForms próbował sprawić wrażenie, że nie jest to programistą. – David

2

W zależności od sytuacji, można uciec z tego hack/Obejście:

private void Page_PreRender(object sender, System.EventArgs e) 
    { 
     if (IsPostBack && !IsCallback) 
     { 

      Response.Write("<html><head><script>location.replace('" + Request.Path + "');\n" + "</script></head><body></body></html>\n"); 

      Response.End(); 

     } 

    } 
Powiązane problemy