【问题标题】:Prevent Postback when user clicks browser's back button当用户单击浏览器的后退按钮时防止回发
【发布时间】:2010-12-19 23:17:09
【问题描述】:

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

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

环境:

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

【问题讨论】:

    标签: asp.net postback back-button


    【解决方案1】:

    在您的代码中,在发送电子邮件之后,执行 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 上读取和删除它是解决此问题的一种方法。如果您在多个地方使用它,您可以围绕它构建一个抽象,或者您可以在 Web 上搜索现有的用于 ASP.NET 表单的 flash/TempData 实现。

    【讨论】:

    • +1 得到很好的答案,教会了我一些新东西。 :) 我真的应该更深入地了解网络开发。
    • +1 不错,我从没想过后退按钮转发问题。非常好!
    • 可能会出现这样的情况,但是进行重定向时,我丢失了在 send() 方法中生成的所有状态信息。这可能是很多开销。 +1
    • 不错的一个。每天都是上学日。
    • @Rick:关于您在上一条评论中描述的情况,我刚刚在我的回答中添加了一个奖励部分。
    猜你喜欢
    • 2011-10-15
    • 2016-12-25
    • 2011-08-30
    • 2013-01-11
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多