4

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

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

环境:

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

1 回答 1

16

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

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

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

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

关于在进行发布/重定向/获取时保持状态的奖励信息

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

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

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

于 2009-11-24T17:02:01.143 回答