我在 UpdatePanel 中有一个 LinkButton,我不希望客户端在 UpdatePanel 刷新其内容之前多次单击它。现在,链接按钮会为每次客户端点击启动部分回发,直到更新面板有时间刷新。这个特定的链接会触发一个非常昂贵的过程,我宁愿不要不必要地运行它。有这样做的.NET 标准方法吗?有什么好的解决方案?谢谢。
5 回答
使用 UpdatePanelAnimationExtender。可用于创建良好的体验并防止进一步交互,直到更新面板完成。将此与 DGH 的服务器端布尔值结合起来,以防止用户刷新页面并再次提交(将布尔值存储在会话状态中)。
可以在此处找到有关 UpdatePanelAnimationExtender 的更多信息:
https://github.com/DevExpress/AjaxControlToolkit/wiki/UpdatePanelAnimation
一种基本方法是在服务器端或会话变量中记录最后一次点击发生的时间。每次点击时,检查最后一次点击时间。如果间隔太小,则返回而不开始其余过程。
另一种方法是在方法开始时将诸如“活动”之类的布尔值设置为 true,并在结束时设置为 false。在方法开始时,检查该变量的当前状态并采取相应措施。
这两种方法之间的主要区别在于,第一种方法允许该方法的多个实例同时运行,只要它们以足够长的间隔交错即可。第二种方法将始终杀死或阻止该方法的任何新实例,直到当前实例结束。
我会删除enabled=false
它,直到部分回发完成,然后删除该enabled=false
属性。
尝试这样的事情,Page_Load
所以它会在第一次被禁用。
button.Attributes.Add("onclick",
"this.disabled = true;"
+ this.ClientScript.GetPostBackEventReference(button, String.Empty) + ";");
然后在部分回发结束时重新启用它?
以上解决方案都不适合我。
我所做的是:
function InitializeRequest(sender, args) {
var oSender = args._postBackElement;
if (oSender.id == "btnSave") {
oSender.href = "javascript: void(0);";
}
}
function EndRequestHandler(sender, args) {
var oSender = sender._postBackSettings.sourceElement;
if (oSender.id == "btnSave") {
oSender.href = "__doPostBack('" + oSender.id + "', '');";
}
}
function load() {
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(InitializeRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
}
<body onload="load()">
将以下脚本放在 ScriptManager 之后的页面上。
<script type="text/javascript">
var postbackControl = null;
var parm = Sys.WebForms.PageRequestManager.getInstance();
parm.add_beginRequest(BeginRequestHandler);
parm.add_endRequest(EndRequestHandler);
function BeginRequestHandler(sender, args)
{
postbackControl = args.get_postBackElement();
postbackControl.disabled = true;
}
function EndRequestHandler(sender, args)
{
postbackControl.disabled = false;
postbackControl = null;
}
</script>