ASP.Net 刷新页面再次发送电子邮件

Posted

技术标签:

【中文标题】ASP.Net 刷新页面再次发送电子邮件【英文标题】:ASP.Net refresh page sends e-mail again 【发布时间】:2011-06-25 14:01:30 【问题描述】:

我有一个页面,当有人提交表单时会向我发送电子邮件,如果用户刷新页面,它会重新发送电子邮件,这显然不理想。

我知道阻止这种情况发生的唯一方法是使用 Session 并说

If Not Session("blah") = "Y" Then
    'Send e-mail and set Session
End If

如果我能提供帮助,我会尽量不使用 Sessions,所以我只是想知道如果用户刷新但没有 Sessions 或重定向到另一个页面,是否有办法不再发送电子邮件?

谢谢

【问题讨论】:

【参考方案1】:

改用页面的 ViewState。将 SentMail 布尔属性添加到您的页面,并在发送电子邮件时将其设置为 true。然后你可以查看If Not SentMail Then SendMail()

Public Property SentMail() As Boolean
    Get
        If ViewState("SentMail") IsNot Nothing Then
            Return Convert.ToBoolean(ViewState("SentMail"))
        Else
            Return False
        End If
    End Get
    Set(ByVal value as Boolean)
        ViewState("SentMail") = value
    End Set
End Property

编辑:您可以做的一件事是在页面的Page_Load 事件中检查If Not IsPostBack,并将属性初始化为false。那么唯一应该将该属性设置为 True 的事件将是实际执行邮件发送的方法:

Protected Sub btnSendMail_Click(ByVal sender as Object, ByVal e as EventArgs) Handles btnSendMail.Click
    If Not SentMail Then
        ' Code to do the sending
        SentMail = True
    End If
End Sub

你可以让它更高级一点,这样页面仍然可以使用,如果你需要通过将其他非视图状态标志耦合到它,比如SentEmailThisPostBack,以便在此进行某种重置value 可以根据一组业务规则执行,甚至可以根据所有用户输入调整 UI 以执行重置。

【讨论】:

downvoter - 请随时发表评论。 1 次代表的成本是值得的,多击几次键的价格是多少? @Joel:我也讨厌匿名投票。 @Tundey - 嗯,我的想法是,如果你有意见,那就拥有它。我什至不介意它是匿名的,只是没有理由支持。 @Joel 这似乎可行,但我的页面上有一些回发,所以这是在发送电子邮件之前设置的 - 有没有办法我仍然可以合并你的想法? @Jamie Taylor - 我有一些想法,但他们参与其中。我会发布一个编辑。【参考方案2】:

您可以尝试强制页面过期。

http://www.netnewsgroups.net/aspnet/t275-page-caching-help-needed.aspx

【讨论】:

【参考方案3】:

当您发送完电子邮件后,Tyr 将 Response.Redirect("YourPage.aspx") 调用到同一页面。

【讨论】:

【参考方案4】:

问题的解决办法是

假设我有一个功能

private void btn_delete_click(object Sender, System.EvenArgs e)

//logic to perform on button click


// In order to reflect the changes on the current page write


Page.Response.Redirect(Page.Request.Url.ToString(), false);

现在点击 F5 ......按钮事件将不会被触发

希望对你有帮助。

【讨论】:

【参考方案5】:

如果电子邮件是在回发上发送的,只需重定向到另一个页面(或同一页面)。只要您不在同一页面上,刷新将停止发送重复的回发。

【讨论】:

我不想将用户重定向到其他页面 @Jamie 仅仅因为你不“想要”并不意味着它不是解决这个问题的公认做法。 @Rex - 但这确实意味着他将其视为他的解决方案(在他的问题正文中指定)。 @Joel 有时只需要对问题有更好的看法,“折扣解决方案”就会重新发挥作用。当有人在没有解释的情况下说“我们不能做 x”时,播放“5 个为什么”。 所以重定向到同一页面。这胜过在会话中放入内容来表示页面已经提交。无论如何,在我看来。【参考方案6】:

看看 Post-Redirect-Get 方法,在 Web 应用程序中很常见。许多人认为您不应该真正从 POST 返回内容 - 只是“成功/失败”。 GET 应该返回内容,因此 POST 应该发出重定向到 GET 另一个页面。

//handle postback & send email
Response.Redirect("~/feedback.aspx");

【讨论】:

+1 用于提及 Post-Redirect-Get 方法(即使它不是 OP 想要的)。坚持网络最佳实践和模式绝不是一个坏主意。

以上是关于ASP.Net 刷新页面再次发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 和 ASP.NET MVC 刷新表信息

在 asp.net 中执行回发操作后刷新页面

ASP.NET 如何防止页面的刷新

asp.net 如何 刷新并关闭父页面?

[转][ASP.net]后台页面刷新

ASP.NET中能不能实现无刷新登录?