2013-07-18 9 views
9

Na mojej stronie internetowej ASP.NET WebForms mam okno modalne, które się wyskakuje. Kod JavaScript do wyświetlania tego okna modalnego jest następująca:Aby ponownie wyświetlić stronę internetową, program Internet Explorer musi ponownie wysłać

function OpenMailAddressWin(subscriberContactRelationGid, routeId, btn) { 
    window.showModalDialog("SubscriberSecondaryAddress.aspx" + BuildQueryStringValuesForSubscriber(subscriberContactRelationGid, routeId, returntxtReceiptDate().value), this, strWindowFeatures + ";scroll:no;dialogWidth:442px;dialogHeight:350px"); 
    location.reload(true); 
} 

Po modalne okno jest zamknięte muszę odświeżyć stronę nadrzędną (stąd location.reload (true); oświadczenie na końcu) w celu zmiany wprowadzone w oknie modalnym, które mają wpływ.

Teraz chodzi o to, że czasami (nie za każdym razem, irytująco) kiedy zamknąć to okno modalne dostaję okienko z ostrzeżeniem, które mówi:

"Aby ponownie wyświetlić stronę internetową, Internet Explorer musi ponownie wysłać informacje, które Jeśli niedawno dokonałeś zakupu, kliknij Anuluj, aby uniknąć duplikowania transakcji. W przeciwnym razie kliknij przycisk Ponów, aby ponownie wyświetlić stronę internetową. "

Jakieś pomysły, dlaczego tak się dzieje?

+0

Czy trwa odświeżenie wiadomości, które może spowodować powstanie tej wiadomości? – melancia

+3

Komunikat sugeruje, że akcja, która skierowała użytkownika do okna nadrzędnego, została opublikowana. Przeglądarki zawsze ostrzegają użytkownika, jeśli ponownie wysyłają post, ponieważ z definicji czasownik postu powoduje zmianę. Może czasami użytkownik odwiedza stronę z postem, a czasami nie? – CurlyPaul

Odpowiedz

29

To jest problem z podwójnym przesłaniem w przeglądarkach.

Po załadowaniu strony za pomocą żądania POST i próbie ponownego załadowania strony przy użyciu location.reload(true);, przeglądarka musi wysłać kolejne żądanie POST do serwera, co może powodować problemy, ponieważ POST powinien zmienić stan na serwerze. Dlatego przeglądarka wymaga potwierdzenia od użytkownika. Aby rozwiązać ten problem, zwykle używamy wzoru POST-REDIRECT-GET.

W twoim przypadku, po prostu użycie location.href = location.href powinno rozwiązać problem, ponieważ spowoduje to ponowne załadowanie strony za pomocą polecenia GET.

+3

w chrome: 'location.reload (true);' działa bez ponownego przesyłania. Właśnie wypróbowałem to ... (w IE - to pyta znowu) +1 –

+0

możesz także użyć, location.assign (location.href); – revolutionNET

1

Możesz utworzyć funkcję setTimeout w ten sposób.
To nie daje żadnej

setTimeout(function() { 
    window.parent.location.reload(); 
}, 100); 
0

I w obliczu tego samego problemu podczas wywoływania modalne okno.
Usunąłem location.reload i właśnie zwrócono wartość true z funkcji.
To rozwiązało mój problem.

1

Występuje, gdy próbujesz zwrócić view(Model) ze swojego żądania POST. W rzeczywistości nie można zwrócić widoku z żądania POST, ponieważ zwrócenie widoku ma być operacją GET i musi zostać wykonane pod żądaniem GET.
Po pomyślnym zaksięgowaniu danych i zapisaniu danych w bazie danych należy użyć kontrolera ReturnToAction i wyświetlić ostateczny widok z tej metody działania.

Także jeśli chcesz odświeżyć swoją stronę, należy użyć location.href = location.href zamiast window.reload(), ponieważ location.href dostanie dane przez GET prośbę.

Powiązane problemy