12

在我的 ASP.NET WebForms 页面中,我弹出了一个模态窗口。显示此模态窗口的 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 需要重新发送您最近提交的信息。

如果您正在购买,您应该点击取消以避免重复交易。否则,请单击重试以再次显示该网页。”

任何想法为什么会发生这种情况?

4

6 回答 6

32

这就是浏览器中的双重提交问题。

当使用 POST 请求加载页面并尝试使用 重新加载页面location.reload(true);时,浏览器需要向服务器发送另一个 POST 请求,这可能会导致问题,因为 POST 应该更改服务器上的状态。因此,浏览器需要用户确认。为了解决这个问题,我们通常使用POST-REDIRECT-GET模式。

在您的情况下,只需简单地使用即可location.href = location.href解决问题,因为这将使用 GET 重新加载页面。

于 2013-07-18T13:10:35.000 回答
4

当您尝试view(Model)POST请求返回时会发生这种情况。实际上,您不能从POST请求返回视图,因为返回视图应该是GET操作,并且必须在GET请求下完成。
因此,在成功发布数据并将数据保存到数据库后,您必须ReturnToAction在控制器中使用并从该操作方法返回最终视图。

另外,如果你想刷新你的页面,你必须使用location.href = location.href而不是window.reload(),因为location.href将通过GET请求获取数据。

于 2017-05-18T06:45:24.430 回答
1

你可以像这样创建一个setTimeout函数。
这不会给你任何

setTimeout(function () {
    window.parent.location.reload();
}, 100);
于 2015-12-11T13:23:10.773 回答
1

当您想刷新父页面时,使用 That works... 在 IE 中刷新页面时会显示警报消息。

这可能是一个有效的灵魂:

window.opener.location.href = window.opener.location.href;
于 2019-02-12T11:13:35.630 回答
0

我在调用模态窗口时遇到了同样的问题。
我删除并从函数中location.reload返回值。 这解决了我的问题。true

于 2016-10-21T13:19:19.187 回答
0

在我的情况下,我有一些完全不相关的重新加载页面,有人放了一些 javascript 代码来重新加载页面以防调整大小,并且它总是在 document.ready 上触发,使其执行两次发布请求,所以如果没有解决方案这里的工作只是确保没有一些随机的 javascript 在你不知道的情况下重新加载页面,按 F12 并检查网络选项卡以查看是否调用了意外的东西可能很有用。

于 2020-03-11T16:11:05.013 回答