【发布时间】:2011-01-11 04:03:27
【问题描述】:
我有 .aspx 页面,该页面通过单击按钮将数据插入数据库。但是当我按下按钮时,它是正确的。我收到“成功插入数据”的成功消息。在这种情况下,如果我按“F5”或刷新页面,它会触发按钮单击事件。为什么应该这样?如何避免这种情况?
【问题讨论】:
-
你能添加一些你的代码吗??
我有 .aspx 页面,该页面通过单击按钮将数据插入数据库。但是当我按下按钮时,它是正确的。我收到“成功插入数据”的成功消息。在这种情况下,如果我按“F5”或刷新页面,它会触发按钮单击事件。为什么应该这样?如何避免这种情况?
【问题讨论】:
添加更新面板并将更新面板的更新模式设置为条件。 这对我有用!
【讨论】:
在你的课堂上添加这个:
#region Browser Refresh
private bool refreshState;
private bool isRefresh;
protected override void LoadViewState(object savedState)
{
object[] AllStates = (object[])savedState;
base.LoadViewState(AllStates[0]);
refreshState = bool.Parse(AllStates[1].ToString());
if (Session["ISREFRESH"] != null && Session["ISREFRESH"] != "")
isRefresh = (refreshState == (bool)Session["ISREFRESH"]);
}
protected override object SaveViewState()
{
Session["ISREFRESH"] = refreshState;
object[] AllStates = new object[3];
AllStates[0] = base.SaveViewState();
AllStates[1] = !(refreshState);
return AllStates;
}
#endregion
然后在您的按钮中单击执行以下操作:
protected void Button1_Click(object sender, EventArgs e)
{
if (isRefresh == false)
{
Insert Code here
【讨论】:
LoadViewState 和SaveViewState 需要连接到某些事件?哪些和/或你是如何做到的?
当用户点击 F5(或使用工具栏按钮刷新页面)时,将导致一个与前一个相同的新请求被发送到服务器。 Button.Click 事件将再次引发,但您有一些方法可以保护自己免受两次插入数据的影响。
恕我直言,最好的方法是使用Post/Redirect/Get pattern。在您的代码中,在数据保存点之后,执行 302 重定向到确认页面:
protected void btnSaveStuff_Click(object sender, EventArgs e)
{
SaveStuffToDatabase();
Response.Redirect("confirmation.aspx");
}
使用该模式时,原页面的POST不会出现在浏览器历史记录中,刷新结果页面会导致最终的GET重复,应该是安全的。
【讨论】:
Response.Redirect,它将“取消”然后POST 并使浏览器变为新的GET。
刷新将重新提交您上次单击按钮时发布的表单。
通常,当您刷新页面时,您会考虑再次获取该页面,或者执行 HTTP GET,但由于您所做的最后一件事是 POST(当您单击提交按钮时),浏览器将再次执行发布以尝试调用相同的响应。
我建议使用 Jorn Schou-Rode 建议的 Post/Redirect/Get 模式。
这篇文章似乎也很相关。 http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh
【讨论】: