今天在做一个项目的用户注册页面时发现,客户端在注册用户时如果在用户注册完成后继续点击F5按钮进行刷新页面那么会重复提交数据,导致用户注册重复。于是在网上搜索了很多关于如何解决F5刷新的问题和解决方法但是实现方式一般都是使用客户端脚本进行控制,细想了下这样的方式比较被动而且也会受到客户端浏览器种类不同的影响,所以想到了在服务端进行控制。
那么在服务端控制的方式最简便的是什么?大家试想下在客户端按F5刷新页面时会重复Button按钮的单击事件,那么我们就从服务端Button按钮的单击事件着手,于是想到了委托机制,既然委托机制能够使用"-= 或 +="为控件进行自定义事件的注册和删除事件委托,那么我们为何不利用这个机制来进行控制,下面是一个非常有效而且简便的使用服务端事件委托机制来防止页面重复提交数据或客户端浏览器使用(F5)刷新提交数据的方法。
下面是实现方法:
首先定义一个私有的静态变量用来标识当数据提交成功后的状态:
我们通常在页面的Page_Load事件中使用if (!IsPostBack)属性来判断是否“是首次”打开本页的,那么我们使用这个属性来判断是否“不是首次”打开本页的,也就是说页面是被刷新或提交数据后接收返回而打开的,结合上面自定义的变量构成一个比较完整的判断方式:
if (IsPostBack && submitState)
{
// 给Button1按钮删除注册的Button1_Click事件
this .Button1.Click -= new ClickEventHandler(Button1_Click);
// 给Button1按钮添加注册kenButton1_Click事件
this .Button1.Click += new ClickEventHandler(kenButton1_Click);
}
在这个判断中大家看到我使用"-="来去掉了Button1按钮的Click默认注册的委托Button1_Click事件,而在下面又使用"+="为这个Button1按钮注册了一个新的单击事件kenButton1_Click,这个事件里会向客户端浏览器显示一行信息提示来警告因重复刷新本页的客户端浏览器:
{
// 显示警告信息
Response.Write( " 此页面禁止使用F5刷新, 请重新打开本页 " );
}
那么这样一来我们只需要在你原先的提交数据按钮Button1的Button1_Click事件中将提交数据成功后的提示信息后把自定义的私有变量值设置为true即可:
protected void Button1_Click( object sender, ClickEventArgs e)
{
// 调用ADO.net将注册信息提交到数据库
if ( // 如果成功提交数据)
{
Response.Write( " 恭喜,新用户注册成功! " );
// 将提交状态变量设置为true
submitState = true ;
// 给Button1按钮删除注册的Button1_Click事件
this .Button1.Click -= new ClickEventHandler(Button1_Click);
// 给Button1按钮添加注册kenButton1_Click事件
this .Button1.Click += new ClickEventHandler(kenButton1_Click);
}
else
{
Response.Write( " 新用户注册失败... " );
}
}
以上方法给大家提供一个思路,按照这样的模式举一反三还能够实现其他有趣的功能,希望能给大家一些帮助。