我在UpdatePanel中有一个LinkButton,我不希望客户端在UpdatePanel刷新其内容之前多次单击。现在,链接按钮为每个客户端单击启动部分回发,直到更新面板有时间刷新。这个特殊的链接引发了一个非常昂贵的过程,我宁愿不必要地运行它。是否有.NET标准的方法来做到这一点?这是一个很好的解决方案吗?感谢。
答案 0 :(得分:4)
使用UpdatePanelAnimationExtender。可用于创建良好体验并防止进一步交互,直到更新面板完成。将其与DGH的服务器端布尔值相结合,以防止用户刷新页面并再次提交(将布尔值存储在会话状态中)。
有关UpdatePanelAnimationExtender的更多信息,请访问:
https://github.com/DevExpress/AjaxControlToolkit/wiki/UpdatePanelAnimation
答案 1 :(得分:2)
一种基本方法是记录服务器端或会话变量中最后一次单击的时间。每次单击,检查最后一次单击时间。如果间隔太小,则返回而不开始剩余的过程。
另一种方法是在方法开始时将诸如“active”的布尔值设置为true,并在结束时将其设置为false。在方法开始时,检查该变量的当前状态并采取相应的行动。
这两种方法的主要区别在于,第一种方法允许方法的多个实例同时运行,只要它们以足够长的间隔交错。第二种方法将始终终止或阻止方法的任何新实例,直到当前方法结束。
答案 2 :(得分:1)
我会删除enabled=false
,直到部分回发结束,然后删除enabled=false
属性。
在Page_Load
上尝试这样的事情,这样第一次就会被禁用。
button.Attributes.Add("onclick",
"this.disabled = true;"
+ this.ClientScript.GetPostBackEventReference(button, String.Empty) + ";");
然后在部分回发结束时重新启用它?
答案 3 :(得分:0)
上述解决方案均不适合我。
我所做的是:
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()">
答案 4 :(得分:0)
在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>