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 刷新页面再次发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章