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?
Odpowiedz
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.
Wielkie dzięki, bardzo pomocne. –
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.
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. –
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
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
- 1. Funkcje zagnieżdżone: Niewłaściwe korzystanie z efektów ubocznych?
- 2. Usunąć elementy w pętli for bez efektów ubocznych?
- 3. Konfigurowanie tras Vue 2.0 - Nie używaj "nowych" dla efektów ubocznych
- 4. Używanie agentów do uzupełniania efektów ubocznych w transakcjach STM
- 5. Ładowanie gravatar za pomocą jquery
- 6. Najlepszy sposób na uniknięcie efektów algorytmu Nagle za pomocą webSockets?
- 7. Ładowanie zasobów za pomocą getClass(). GetResource()
- 8. Monitoruj ładowanie baterii za pomocą Win32 API
- 9. Ładowanie dużych zestawów danych za pomocą AngularJS
- 10. Ładowanie dynamicznego adresu URL za pomocą modalnego
- 11. Ładowanie znaków specjalnych za pomocą PyYaml
- 12. PyBrain: Ładowanie danych za pomocą numpy.loadtxt?
- 13. Ładowanie modułów non amd za pomocą require.js
- 14. Chętne ładowanie drzewa/hierarchii za pomocą Nhibernate
- 15. Automatyczne ładowanie PHP za pomocą SplClassLoader?
- 16. Ładowanie zasobów stylu FireMonkey za pomocą RTTI
- 17. Android: ograniczaj ładowanie fragmentów za pomocą viewPager
- 18. Ładowanie obrazów synchronicznie za pomocą javascript
- 19. Ładowanie niestandardowych złożeń za pomocą CompileAssemblyFromSource
- 20. Ładowanie wielu bibliotek map za pomocą javascript
- 21. Powolne Ładowanie dużych obrazów za pomocą Picassa
- 22. Odświeżenie ASP.NET za pomocą jQuery?
- 23. ASP.Net MVC Ładowanie w toku
- 24. Uwierzytelnianie za pomocą karty inteligentnej za pomocą programu ASP.NET
- 25. Wybieranie za pomocą atrybutu ID za pomocą JQuery w ASP.NET
- 26. "Zajęta" nakładka efektów
- 27. Gąsienicowa fabuła tylko "znaczących" efektów losowych z mieszanego modelu efektów
- 28. Arel: Lewe sprzężenie zewnętrzne za pomocą symboli
- 29. Definiowanie trasy ASP.NET MVC za pomocą ukośników
- 30. Prawa wykonawcze za pomocą ASP.NET Identity
Zobacz: http://stackoverflow.com/questions/743580/page-refresh-causes-duplicate-post-in-asp-net-aplikacje – Shog9