2

我的页面上有一个 LinkBut​​ton,当它被点击时,正常行为将回发到同一页面(您可以通过按 F5 刷新页面来判断页面已发布,您将从浏览器中获得一个确认框“您的页面正在查找您输入的已使用信息。返回该页面可能会导致您重复执行的任何操作。您要继续吗?")

所以为了防止用户重新提交处理过的表单,我决定将其response.redirect到同一个页面。

void LinkButton1_Click(object sender, EventArgs e) {
    Response.Redirect("Default.aspx"); //redirecting back to the same page
}

就我而言,Response.Redirect 应该使用 GET,但在这种情况下它使用的是 POST(重定向后,如果我想重新提交表单,F5 刷新仍会提示我)。我怀疑 Response.Redirect 没有执行,所以我将 url 从“Default.aspx”更改为“HelloWorld.aspx”,它位于同一服务器的同一目录中,并正确重定向。现在按 F5 将立即刷新页面,而不会询问我是否要重新提交页面。

是什么赋予了?我的页面上有其他代码,但我怀疑它们导致了这种行为,并且它们太长而无法在此处发布。如果需要,我会提供。感谢您花时间阅读本文。

4

2 回答 2

3

你在用 Chrome 吗?Post/Redirect/Get模式似乎已损坏,即使发出了 Response.Redirect(),也会导致“确认表单重新提交”对话框:https ://code.google.com/p/chromium/issues/detail?编号=21245

其次,Response.Redirect() 总是这样工作,以 Default.aspx 为例:

  • 打开页面
  • 客户端:HTTP GET Default.aspx
  • 服务器:HTTP 200 好的
  • 输入表单数据,按提交按钮
  • 客户端:HTTP POST Default.aspx
  • 服务器:HTTP 302 重定向到 Default.aspx
  • 客户端:HTTP GET Default.aspx

我创建了一个带有表单的示例 ASP.NET 应用程序,然后添加了一个带有调用的事件处理程序的 LinkBut​​ton,Response.Redirect(Request.RawUrl)顺便说一下,它比类似的东西更受欢迎,Response.Redirect("Default.aspx")因为它使用调用页面的相对路径并在开发和部署环境中工作。

在 IE 中,在表单中输入数据并按提交,然后按 F5 后,我没有看到“确认表单重新提交”对话框。与 Firefox 相同;没有对话。但在 Chrome 中,我确实收到了警告。我唯一的结论是您可能遇到了 Chrome 问题。

于 2013-03-10T06:55:33.247 回答
2

怎么了

我在 Chrome 中注意到了这个问题,但在 Firefox 或 IE 中没有。

事实上,Chrome 正在执行 GET,但它将 POST 和 GET 捆绑在一起——我想这涉及到一些优化。

Ctrl-F12您可以通过点击,查看网络选项卡来确认此行为。请注意,将有一个 302 POST 和一个 200 GET。

我不明白 Chrome 到底在做什么,因为调试器显示 302 后跟 GET,但刷新清楚地提示表单重新提交。

信息冲突

互联网上存在关于 302 重定向的严重错误信息,尤其是在 Stack Overflow 上。

从历史上看,大多数浏览器在遇到 302 重定向时都会将 POST 转换为 GET。

但是,根据标准,一个 POST 应该保持一个 POST,一个 GET 应该保持一个 GET ( Source )。尽管如此,大多数浏览器继续将所有 302 转换为 GET。

他们这样做可能是因为典型的浏览体验对于所有额外的表单重新提交对话框更加烦人。它也可能是更快的浏览。

如何修复它

303 重定向是在 POST 之后重定向应用程序的正确方法。

Response.Clear();
Response.Status = "303 See Other";
Response.AddHeader("Location", "MyNewURL");
Response.End();

如果您使用此方法,所有浏览器的行为都会一致,因为浏览器必须对新 URL 使用 GET。

参考

于 2013-03-10T06:47:01.403 回答