2013-07-18 45 views
9

在我的ASP.NET WebForms頁面中,我彈出一個Modal窗口。顯示該模式窗口的JavaScript代碼如下:要再次顯示網頁,Internet Explorer需要重新發送

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); 
} 

後的模態窗口關閉,我需要刷新父頁面(因此location.reload(真);在最後陳述),以便模態窗口中所做的更改會生效。

現在的事情是,有時(不是每一次,僵硬),當我關閉這個模式窗口,我得到一個警告彈出它說:

「要再次顯示該網頁時,Internet Explorer需要重新發送你的信息最近已提交

如果您正在進行購買,您應該點擊取消以避免重複的交易,否則請點擊重試以再次顯示該網頁。

任何想法爲什麼會發生這種情況?

+0

是否有任何回傳可能會導致此消息? – melancia

+3

該消息會建議發佈將用戶引導至父窗口的操作。瀏覽器總是會警告用戶他們是否重新發送帖子,因爲根據定義,帖子動詞會導致某些內容發生變化。 也許有時用戶通過帖子訪問該頁面,有時他們不會? – CurlyPaul

回答

29

這是瀏覽器中的雙重提交問題。

當使用POST請求加載頁面並嘗試使用location.reload(true);重新加載頁面時,瀏覽器需要向服務器發送另一個POST請求,這可能會導致問題,因爲POST應該會改變服務器上的狀態。因此,瀏覽器需要用戶的確認。爲了解決這個問題,我們通常使用POST-REDIRECT-GET模式。

就你而言,只需簡單地使用location.href = location.href即可解決問題,因爲這將使用GET重新加載頁面。

+3

in chrome:'location.reload(true);'不需要重新提交。我剛剛嘗試過...(在IE中 - 它再次詢問)+1 –

+0

你也可以使用,location.assign(location.href); – revolutionNET

1

您可以創建一個setTimeout這樣的功能。
這不會給你任何

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

我同時呼籲模態窗口面臨着同樣的問題。
我刪除location.reload,剛剛從函數返回值true
這解決了我的問題。

1

當您嘗試從POST請求返回view(Model)時,會發生這種情況。其實你不能從POST請求返回視圖,因爲返回視圖應該是GET操作,它必須在GET請求下完成。
因此,在成功發佈數據並將數據保存在數據庫中之後,您必須在控制器中使用ReturnToAction,並從該操作方法返回最終視圖。

而且如果你想刷新頁面,則必須使用location.href = location.href代替window.reload(),因爲location.href將得到的數據通過GET請求。

相關問題