2009-08-20 12 views
6

Jestem względnie nowy w sieciowym rozwoju ASP.Net, więc proszę o mnie. Podczas testowania naszych stron zauważyłem, że jeśli użytkownik kliknie "Odśwież/Załaduj ponownie" i kliknie "Ponów" po wyświetleniu monitu w oknie dialogowym "Ponownie wyślij informacje", niezależnie od ostatniego zdarzenia, które zostało uruchomione przed wyborem użytkownika do "Refresh", zostanie ponownie wystrzelony.
Jako przykład mamy przyciski "Poprzedni" i "Dalej", które pozwalają użytkownikowi poruszać się po serii pytań. Jeśli operator kliknie "Odśwież/Załaduj ponownie", przycisk "Wciśnij" przycisk "Ostatnie naciśnięcie" spowoduje ponowne uruchomienie. To faktycznie ma sens, ale efekt netto jest taki, że użytkownik kończy na następnej lub poprzedniej stronie, z której wcześniej oglądał. Czy istnieje jakieś obejście tego typu rzeczy?Odświeżanie/ponowne ładowanie efektów ubocznych za pomocą ASP.net?

+0

Zobacz: http://stackoverflow.com/questions/743580/page-refresh-causes-duplicate-post-in-asp-net-aplikacje – Shog9

Odpowiedz

4

Jest to spowodowane sposobem postępowania z użytkownikiem PostBacks.

Trochę tło jest konieczne:

W internecie jest „bezpaństwowiec”, co oznacza, że ​​każdy wniosek od klienta do serwera jest niezależne od żądania przed nim lub po nim wniosek. Nie ma "stanu" utrzymywanego. Jeśli spojrzysz na poziom HTTP, jest to po prostu kropka tekstowa wysłana na serwer, która mówi "wyślij mi tę informację", a serwer odsyła ją. Nie ma "Jestem tym samym użytkownikiem, który był tutaj 3 minuty temu i chciałbym przejść do następnej strony od tej, z której ostatnio rozmawiałem".

Sposób, w jaki program ASP.NET rozwiązuje ten problem, korzysta z ViewState i postbacków. Za każdym razem, gdy klikniesz przycisk ASP.NET, w rzeczywistości jest to formularz zawierający ukryte pole z wieloma zakodowanymi danymi. Dane te zawierają wszystkie dane potrzebne serwerowi do "odtworzenia" stanu strony, tak jak to było ostatnio. Następnie może wykonać "przejść do następnej strony" i to polecenie ma sens. Kiedy ASP.NET wysyła HTML z powrotem do klienta, aktualizuje to ukryte pole z nowymi danymi, ponownie reprezentując stan strony, tak jak jest teraz. Następnym razem, gdy klikniesz dowolny przycisk, dane zostaną wysłane ponownie, strona zostanie zrekonstruowana ponownie i cykl się powtarza.

Gdy użytkownik kliknie "odśwież", przeglądarka zapyta ich, czy chcą ponownie przesłać formularz. Ponownie przesyłają te same dane, które robili po raz ostatni.

Implikacje dla Ciebie:

Jeśli próbować śledzić wszelkie dane na temat użytkownika lub co robią niezależnie od ASP.NET ViewState, trzeba upewnić się, że synchronizacja każdej chwili strona procesy.

Prawdopodobnie chcesz zachować „bieżącą stronę” w ViewState:

ViewState.Add("CurrentPage", intCurrentPage); 

Więc kiedy zadzwonić do obsługi MoveNext zdarzeń, można mieć pewność, że poruszają się względem strony, jak to było ostatni raz został wysłany do klienta.

+0

Wielkie dzięki, bardzo pomocne. –

1

Można spojrzeć na wzór Post-Redirect-Get, który jest częściej używany w asp.net mvc.

Aby uzyskać więcej informacji, zobacz here.

+0

To dobra technika do łagodzenia rzeczywistych ponownych przesłanych formularzy, ale nie jestem pewien, czy dobrym pomysłem byłoby użycie jej w zasadzie do każdego żądania w wysoce stanowej aplikacji WebForms. To podwaja liczbę wniosków w całej aplikacji. –

+0

PO nic nie wspomniał o "wysoce stateful", to tylko twoje założenie i jeśli nie ma> 200 próśb na sekundę, jego infrastruktura prawie nie zauważy dodatkowej podróży w obie strony. Aby pozbyć się tych dialogów i niebezpieczeństw związanych z ponownym przedłożeniem, warto wykonać dodatkową pracę. – redsquare

+0

Jeśli zauważysz, że SO używa tej samej techniki. Nie widzę tutaj zbyt wielu problemów związanych z perfekcją, ale pojawia się to więcej niż kilka razy na sekundę! – redsquare

Powiązane problemy