2011-12-02 317 views
1

什么是防止用户双击或刷新页面的最好方法,这会导致执行SQL插入语句两次,我试图在点击后禁用按钮,但结果并不是很好。我期待可以从代码隐藏的角度来做到这一点。更多的东西像SQL提交和回滚SQL插入语句执行两次

回答

1

也许PRG wikipedia article可以帮助你:

邮政/重定向/获取(PRG)是Web开发人员 常见的设计模式,以帮助避免某些重复的表单提交,并允许用户代理 可以更直观地使用书签和刷新按钮。

+1

PRG不会阻止多个表单提交作为双击或​​在长时间运行请求期间(例如在发出“重定向”响应之前)的页面刷新的结果。 OP询问了一种方法,可以防止双击时出现重复,不一定只是在完成一切后刷新页面。 –

+0

@AlexNorcliffe,谢谢澄清。我会保留让人们可以阅读你的评论的答案。 +1 – danihp

1

如果您希望防止出现这种情况,您需要服务器知道当前用户已经开始了一个操作,并且在条件满足之前不能再次开始操作。

您需要能够识别可能访问您网站的用户。这很简单,只需使用SessionState即可完成,但如果您没有其他SessionState需求并希望大规模扩展您的应用程序,则可以使用简单的随机Cookie来标识用户,作为用于将项目放入服务器缓存。

假设你使用了SessionState。你会像做以下(伪):

public void StartAction() 
{ 
    var inProgress = HttpContext.Current.Session["actionInProgress"] as bool; 
    if (!inProgress) 
    { 
    try 
    { 
     HttpContext.Current.Session["actionInProgress"] = true; 
     MySqlController.DoWork(); 
    } 
    finally 
    { 
     HttpContext.Current.Session["actionInProgress"] = false; 
    } 
    } 
} 

以上不考虑以下几点:

  • 捕获异常和/或在您的finally
  • 队列关闭所有连接随后在下一次点击客户端时执行后续操作(如果操作已在进行中,此伪代码仅返回)
  • 我已经找到了最简单的解决方案,但实际上更好的做法是将这个包含在一个异步运行的服务中,这样您就可以监视进程,既为用户带来好处,也为了防止多个并行进程。