我有一个向多个用户发送电子邮件的网页(在线分发列表)。单击提交按钮并发送电子邮件后,将显示状态页面,其中列出已发送的电子邮件数,错误和其他信息。如果用户单击后退按钮,则会重新发送电子邮件。我该如何防止这种情况?
注意:在实际发送电子邮件之前,浏览器会提示用户“重新提交”或“重新发送”数据到页面,但这不会阻止我的用户点击它,然后想知道为什么发送了两份电子邮件副本进行。
环境:
答案 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的现有实现。