用户单击浏览器的后退按钮时阻止回发

时间:2009-11-24 16:58:21

标签: asp.net postback back-button

我有一个向多个用户发送电子邮件的网页(在线分发列表)。单击提交按钮并发送电子邮件后,将显示状态页面,其中列出已发送的电子邮件数,错误和其他信息。如果用户单击后退按钮,则会重新发送电子邮件。我该如何防止这种情况?

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

环境:

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

1 个答案:

答案 0 :(得分:16)

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

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

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

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

关于在进行发布/重定向/获取

时保持状态的奖励信息

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

如果您在处理POST请求时生成某种“状态对象”(可能是已发送邮件的日志),则需要某种方法来保存此对象以用于以下GET请求。一些Web框架具有专门针对此的功能:RoR具有flash,ASP.NET MVC具有TempData。 ASP.NET表单没有内置的这样的概念,所以你必须自己解决一些问题。

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