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

Ric*_*ick 3 asp.net postback back-button

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

注:浏览器就提示用户"重新提交"或实际发送电子邮件之前"重新发送"数据页面,但不会从单击它,然后不知道为什么邮件的两个副本共出动停止我的用户.

环境:

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

Jør*_*ode 16

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

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

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

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

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

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

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

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