在我的ASP.NET WebForms页面中,我弹出了一个Modal窗口。用于显示此模态窗口的javascript代码如下:
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(true);语句),以便在模态窗口中进行更改生效。
现在,当我关闭这个模态窗口时,有时候(不是每次都是真气),我会收到一个警告弹出窗口,上面写着:
“要再次显示网页,Internet Explorer需要重新发送您最近提交的信息。
如果您要进行购买,则应单击“取消”以避免重复交易。否则,请单击“重试”以再次显示该网页。“
为什么会发生这种情况?
答案 0 :(得分:30)
这是浏览器中的双重提交问题。
当使用POST请求加载页面并尝试使用location.reload(true);
重新加载页面时,浏览器需要向服务器发送另一个POST请求,这可能会导致问题,因为POST应该更改状态服务器。因此,浏览器需要来自用户的确认。要解决此问题,我们通常使用POST-REDIRECT-GET模式。
在您的情况下,只需使用location.href = location.href
即可解决问题,因为这将使用GET重新加载页面。
答案 1 :(得分:3)
当您尝试从 POST 请求中返回view(Model)
时会发生这种情况。实际上,您无法从 POST 请求返回视图,因为返回视图应该是 GET 操作,并且必须在 GET 请求下完成。
因此,在成功发布数据并将数据保存在数据库中之后,您必须在控制器中使用ReturnToAction
并从该操作方法返回最终视图。
此外,如果您要刷新页面,则必须使用location.href = location.href
代替window.reload()
,因为location.href
将通过 GET 请求获取数据。< / p>
答案 2 :(得分:1)
您可以像这样创建setTimeout
功能
这不会给你任何
setTimeout(function () {
window.parent.location.reload();
}, 100);
答案 3 :(得分:1)
使用以下命令刷新IE中的页面时显示警报消息 可行...当您要刷新父页面时。
这可能是一个有效的灵魂:
window.opener.location.href = window.opener.location.href;
答案 4 :(得分:0)
我在调用模态窗口时遇到了同样的问题
我删除了location.reload
,只是从函数中返回了true
值
这解决了我的问题。
答案 5 :(得分:0)
在我的情况下,我有一些完全不相关的重载页面,有人在调整大小的情况下放了一些javascript代码来重载页面,并且总是在document.ready上触发它,使其两次执行发布请求,所以如果没有这些解决方案的工作原理只是确保在您不知情的情况下,没有随机的javascript重新加载页面,按F12并检查“网络”标签以查看是否有意外调用可能很有用。