我有一个页面,其中包含更新面板中的树视图控件。当用户在树视图上展开节点时,会导致对服务器的ajax回调。服务器将新行添加到展开的节点并返回到客户端。但有时,可能会出现连接问题。我为此处理错误。当发生连接错误时,我想显示一个"重试"用于重试上次ajax操作的按钮。我的问题是:如何从Microsoft Ajax Library(Javascript)重试最后一个ajax操作?
PS:抱歉我的英语不好。
答案 0 :(得分:0)
您需要订阅管道的endRequest事件。
以下是我如何解决问题的示例。 Scriptmanager是必需的。我也使用了jquery,但这是可选的:
我有一个执行长时间操作的按钮。这么长的操作实际上是导致超时
<asp:Button ID="btnLongOperation" runat="server" OnClick="btnLongOperation_OnClick" Text="Click for magic..." />
<asp:UpdatePanel runat="server" ID="upStuff" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnLongOperation" />
</Triggers>
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>
在服务器端调用此方法。 HttpTimeout在90秒后被提升。因为线程休眠100秒,所以它总是以超时结束。
protected void btnLongOperation_OnClick(object sender, EventArgs e)
{
Thread.Sleep(100000);
}
现在我添加了这段javascript来订阅endRequest事件。如果引发此事件,我可以检查请求的结果是否是错误,以及错误是否为TimeoutException类型。如果是这样,我可以采取相应的行动。
<script src="Scripts/jquery-2.1.1.js"></script>
<script type="text/javascript">
$(function () {
//subscribe to endRequest
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
});
function endRequestHandler(sender, args) {
//only act if sender is my button
if (sender && sender._activeElement && sender._activeElement.id === "btnLongOperation") {
//only act if response is an error type of Sys.WebForms.PageRequestManagerTimeoutException
if (args && args.get_error() && args.get_error().name && args.get_error().name.indexOf("TimeoutException") >= 0) {
alert("retry could be handled from here");
}
}
}
</script>
这是一个快速而肮脏的解决方案,但应该可以解决您的问题。你可能想稍微重构一下javascript代码,以减少它的气味; - )