在您的代码中,在发送电子邮件之后,执行 302 重定向到确认页面:
protected void btnSend_Click(object sender, EventArgs e)
{
SendManyEmails();
Response.Redirect("confirmation.aspx");
}
使用这种代码,对原始页面的 POST 不会出现在浏览器历史记录中。
这种常见的模式被称为Post/Redirect/Get 模式。
关于在进行发布/重定向/获取时保持状态的奖励信息
这种模式的主要缺点是,当重定向用户时,处理 POST 请求的所有状态都会丢失 - 因此,开始一个新的请求上下文。在 ASP.NET 中,这包括Page
和所有Control
对象中的成员,以及存储在ViewState
.
如果您在处理 POST 请求时生成某种“状态对象”(可能是已发送邮件消息的日志),您将需要某种方法来保存该对象以用于以下 GET 请求。一些 Web 框架具有专门用于此的功能:RoR 具有flash
,ASP.NET MVC 具有TempData
. ASP.NET 表单没有内置这样的概念,因此您必须自己弄清楚。
将对象保存到Session
POST 上,在下面的 GET 上读取和删除它是解决此问题的一种方法。如果您在多个地方使用它,您可以围绕它构建一个抽象,或者您可以在 Web 上搜索用于 ASP.NET 表单的 flash/TempData 的现有实现。