如何防止刷新页面重复提交数据的问题
精选
转载
1.this.response.redirect("xxx.aspx");
做完数据处理后,重新定向本页面,也就是重新加载本页面,用户再点刷新时,只是本页面的刷新,不会更新数据库。这个方法比较简单。
2.在网页生成时,在服务器端Application和客户端ViewState设置两个参数,当更新本页面时,校验这两个参数是否一致,一致则为客户端正常请求服务器,不一致则客户端请求无效(如页面刷新,或者数据过期)。
实现代码:
在page_load事件里面
if (!this.IsPostBack)
{
// 绑定数据
GridView1.DataSource = getData();
GridView1.DataBind();
// 设置本次加载页面的随即数,用于防止刷新,重复更新数据
pageNum = getNumber();//getNumber为生成4位的随机数。
ViewState["pageNum"] = pageNum;
// 用application保存,为了防止多个用户更新同一条数据
Application["pageNum"] = pageNum;
}
else
{
// 判断客户端变量和服务器变量是否一致,防止刷新。
if (Application["pageNum"].ToString() != ViewState["pageNum"].ToString())
{
// 发送客户端脚本,并重新定向到本页面。
ClientScript.RegisterClientScriptBlock(this.GetType(), "messageBox", "<script language='javascript'>alert('数据过期,请重新加载页面!');document.location='frmMonthEnd.aspx';</script>");
}
else
{
// 生成新的校验数据
pageNum = getNumber();
ViewState["pageNum"] = pageNum;
Application["pageNum"] = pageNum;
}
}
在你更新数据库的事件里面写
if (Application["pageNum"].ToString() != ViewState["pageNum"].ToString())
{
return;
}
// 返回一个4位随机数
private string getNumber()
{
Random rd = new Random();
return Convert.ToString((rd.Next(9) +1)* 1000 + rd.Next(10) * 100 + rd.Next(10) * 10 + rd.Next(10));
}
最后说明下为啥用Application,这种情况是考虑到,当多个用户先后打开本页面,他们都要更新本页面的数据,这个时候需要验证这些用户的验证变量是否与服务器的一致,只有最后一个打开本页面的才可以更新本页面。当然也可以改变一下代码,让所有人都能更新数据,但第一个人更新后,其他人更新时,会提示数据过期,重新加载页面。
if (!this.IsPostBack)
{
// 绑定数据
GridView1.DataSource = getData();
GridView1.DataBind();
// 设置本次加载页面的随即数,用于防止刷新,重复更新数据
if(Application["pageNum"]==null)
{
pageNum = getNumber();//getNumber为生成4位的随机数。
ViewState["pageNum"] = pageNum;
// 用application保存,为了防止多个用户更新同一条数据
Application["pageNum"] = pageNum;
else{
ViewState["pageNum"].ToString()=Application["pageNum"].ToString() ;
}
else
{
// 判断客户端变量和服务器变量是否一致,防止刷新。
if (Application["pageNum"].ToString() != ViewState["pageNum"].ToString())
{
// 发送客户端脚本,并重新定向到本页面。
ClientScript.RegisterClientScriptBlock(this.GetType(), "messageBox", "<script language='javascript'>alert('数据过期,请重新加载页面!');document.location='frmMonthEnd.aspx';</script>");
}
else
{
// 生成新的校验数据
pageNum = getNumber();
ViewState["pageNum"] = pageNum;
Application["pageNum"] = pageNum;
}
}
|
|