【发布时间】:2012-01-11 19:44:57
【问题描述】:
防止用户双击或刷新页面会导致执行两次SQL插入语句的最佳方法是什么,我尝试在单击后禁用该按钮,但结果并不是很好。我期待可以从代码隐藏中做到这一点。更像是 SQL 提交和回滚
【问题讨论】:
标签: c# asp.net sql insert sqlcommand
防止用户双击或刷新页面会导致执行两次SQL插入语句的最佳方法是什么,我尝试在单击后禁用该按钮,但结果并不是很好。我期待可以从代码隐藏中做到这一点。更像是 SQL 提交和回滚
【问题讨论】:
标签: c# asp.net sql insert sqlcommand
或许PRG wikipedia article可以帮到你:
Post/Redirect/Get (PRG) 是 Web 开发人员常用的设计模式 帮助避免某些重复的表单提交并允许用户代理 使用书签和刷新按钮更直观地表现。
【讨论】:
如果你想防止这种情况发生,你需要服务器知道当前用户已经开始了一个动作,并且在满足一个条件之前不能再次开始。
您需要能够在众多可能访问您网站的用户中识别出该用户。这是最简单的使用 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 块中捕获异常和/或关闭任何连接【讨论】: