【发布时间】:2011-04-04 17:44:30
【问题描述】:
这里很简单...有没有一种干净的方法可以防止用户双击 Web 表单中的按钮,从而导致重复事件触发?
例如,如果我有一个评论表单,并且用户输入“这是我的评论”并点击提交,评论将显示在下面...但是如果他们双击、三次单击或只是在它们可能会导致发布多个版本。
客户端我可以很容易地禁用按钮 onclick - 但我更喜欢服务器端解决方案,而不是这样的事情:)
是否可以设置每个视图状态的回发超时?
谢谢
【问题讨论】:
这里很简单...有没有一种干净的方法可以防止用户双击 Web 表单中的按钮,从而导致重复事件触发?
例如,如果我有一个评论表单,并且用户输入“这是我的评论”并点击提交,评论将显示在下面...但是如果他们双击、三次单击或只是在它们可能会导致发布多个版本。
客户端我可以很容易地禁用按钮 onclick - 但我更喜欢服务器端解决方案,而不是这样的事情:)
是否可以设置每个视图状态的回发超时?
谢谢
【问题讨论】:
我认为您不应该为这些琐碎的任务加载服务器。您可以尝试一些 jquery UI 阻塞解决方案,例如 this 之一。 Microsoft Ajax 工具包也应该有一些做同样的控制。我很久以前用过它,但似乎无法回忆起控件名称。
【讨论】:
使用 jQuery,您可以使用 one 事件。
另一个有趣的阅读是:Build Your ASP.NET Pages on a Richer Bedrock。
【讨论】:
在用户进入页面时设置会话变量,如 Session["FormXYZSubmitted"]=false。 提交表单时检查变量,如
if((bool) Session["FormXYZSubmitted"] == false) {
// save to db
Session["FormXYZSubmitted"] = true;
}
【讨论】:
如果您使用 Asp.Net 验证,客户端可能会很棘手。
如果您有母版页,请将其放在母版页中:
void IterateThroughControls(Control parent)
{
foreach (Control SelectedButton in parent.Controls)
{
if (SelectedButton is Button)
{
((Button)SelectedButton).Attributes.Add("onclick", " this.disabled = true; " + Page.ClientScript.GetPostBackEventReference(((Button)SelectedButton), null) + ";");
}
if (SelectedButton.Controls.Count > 0)
{
IterateThroughControls(SelectedButton);
}
}
}
然后将其添加到母版页 Page_Load:
IterateThroughControls(this);
【讨论】:
我也遇到过同样的情况。我的一个同事的解决方案是在 Javascript 中实现一种 Timer,以避免将第二次点击视为点击。
希望对你有帮助,
【讨论】:
禁用单击按钮,使用 jquery 或 microsoft ajax 工具包。
【讨论】:
根据这对您的重要性,可以创建一个包含一次性 GUID 的数组,您可以在处理完更新后将其从数组中删除(即在视图状态/隐藏字段中回发)
如果回发时 guid 不在数组中,则请求无效。
在集群环境中用数据库表替换数组。
【讨论】: