gpt4 book ai didi

asp.net - 当用户单击浏览器的后退按钮时防止回发

转载 作者:行者123 更新时间:2023-12-02 13:39:31 24 4
gpt4 key购买 nike

我有一个网页,可以向多个用户发送电子邮件(在线通讯组列表)。单击提交按钮并发送电子邮件后,将显示一个状态页面,列出已发送的电子邮件数量、错误和其他信息。如果用户单击后退按钮,则会重新发送电子邮件。我怎样才能防止这种情况发生?

注意:在实际发送电子邮件之前,浏览器确实会提示用户“重新提交”或“重新发送”数据到页面,但这并不能阻止我的用户单击它,然后想知道为什么发送了两份电子邮件副本出来。

环境:

  • 服务器:C#、ASP.NET 2.0、IIS6
  • 客户端:任何浏览器(我不需要 SmartNavigation 等特定于 IE 的解决方案)

最佳答案

在您的代码中,在发送电子邮件之后,执行 302 重定向到确认页面:

protected void btnSend_Click(object sender, EventArgs e)
{
SendManyEmails();
Response.Redirect("confirmation.aspx");
}

使用这种代码,对原始页面的 POST 将不会出现在浏览器历史记录中。

这种常见模式被称为 Post/Redirect/Get pattern .

关于在执行 Post/Redirect/Get 时保持状态的额外信息

此模式的主要缺点是,在重定向用户时,处理 POST 请求的所有状态都会丢失 - 因此,开始一个新的请求上下文。在 ASP.NET 中,这包括 Page 中的成员和所有 Control 对象,以及存储在 ViewState 中的所有内容。

如果您在处理 POST 请求时生成某种“状态对象”(可能是已发送邮件消息的日志),则需要某种方法来为后续 GET 请求保存该对象。一些 Web 框架具有专门用于此目的的功能:RoR 有 flash,ASP.NET MVC 有 TempData。 ASP.NET 表单没有内置这样的概念,因此您必须自己弄清楚一些事情。

在 POST 上将对象保存到 Session 中,在接下来的 GET 上读取并删除它是解决此问题的一种方法。如果您在多个地方使用它,则可以围绕它构建一个抽象,或者您可以在网络上搜索 ASP.NET 表单的 flash/TempData 的现有实现。

关于asp.net - 当用户单击浏览器的后退按钮时防止回发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com