什么是防止用户双击或刷新页面的最好方法,这会导致执行SQL插入语句两次,我试图在点击后禁用按钮,但结果并不是很好。我期待可以从代码隐藏的角度来做到这一点。更多的东西像SQL提交和回滚SQL插入语句执行两次
1
A
回答
1
也许PRG wikipedia article可以帮助你:
邮政/重定向/获取(PRG)是Web开发人员 常见的设计模式,以帮助避免某些重复的表单提交,并允许用户代理 可以更直观地使用书签和刷新按钮。
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
块 - 队列关闭所有连接随后在下一次点击客户端时执行后续操作(如果操作已在进行中,此伪代码仅返回)
- 我已经找到了最简单的解决方案,但实际上更好的做法是将这个包含在一个异步运行的服务中,这样您就可以监视进程,既为用户带来好处,也为了防止多个并行进程。
相关问题
- 1. Vb.net插入行语句执行两次
- 2. SQL插入查询执行两次
- 3. Python 3会执行两次语句吗?
- 4. SQL插入语句
- 5. 执行SQL语句
- 6. SQL执行语句
- 7. sql插入语句语法
- 8. 告诉NHibernate执行插入语句
- 9. 如何动态执行插入语句
- 10. 无法执行插入语句
- 11. PHP插入语句插入数组值两次
- 12. PHP错误 - IF语句所做插入运行两次
- 13. SQL Compact - 执行多个插入语句时出错
- 14. 在插入后从执行select语句停止LINQ to SQL
- 15. 使用执行INSERT语句中的子插入语句的MyBatis
- 16. SQL插入C语句#
- 17. SQL Server插入语句
- 18. 未插入SQL语句
- 19. Cakephp插入sql语句
- 20. OleDb SQL插入语句
- 21. SQL语句数据插入
- 22. 插入SQL语句错误
- 23. 循环SQL语句插入
- 24. 将mysql插入语句转换为sql server插入语句?
- 25. 执行的SQL语句
- 26. Sql语句不执行
- 27. 如何执行SQL语句?
- 28. Sql插入语句返回“零/无行插入”
- 29. SQL SERVER插入使用插入多行到选择语句
- 30. SQL Server:插入INTO语句语法
PRG不会阻止多个表单提交作为双击或在长时间运行请求期间(例如在发出“重定向”响应之前)的页面刷新的结果。 OP询问了一种方法,可以防止双击时出现重复,不一定只是在完成一切后刷新页面。 –
@AlexNorcliffe,谢谢澄清。我会保留让人们可以阅读你的评论的答案。 +1 – danihp