我有一个带有两个回发事件的 ASP.NET 网页,第二个正在中止第一个。然后,第二个完成后不会按预期呈现。
详细地
我有一个有效地包含两个链接按钮的 ASP.NET 网页。它使用 Telerik ASP.NET AJAX 控件,但我不确定行为是否特定于这些控件:
页面- 一个非常精简的版本如下:
<telerik:RadToolTipManager ID="RadToolTipManager1" runat="server"
Position="BottomLeft" RelativeTo="Element" ShowEvent="OnClick"
HideEvent="ManualClose" Animation="Fade" OnAjaxUpdate="OnShowItems" >
<TargetControls>
<telerik:ToolTipTargetControl TargetControlID="btnShowItems" />
</TargetControls>
</telerik:RadToolTipManager>
...
...
<asp:LinkButton ID="btnShowItems" runat="server" Visible="false">
<span><%= ItemsPrompt %></span>
</asp:LinkButton>
...
...
<uc1:X ID="XControl" runat="server"/>
UserControl "X" - 一个非常精简的版本如下:
<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server"
LoadingPanelID="LoadingPanel1" RenderMode="Block">
<asp:LinkButton runat="server" ID="CausePostbackButton"
Style="display: none" />
</telerik:RadAjaxPanel>
用例 #1 - 成功
- 页面加载,控件“X”中的 JavaScript 计时器激活 LinkButton“CausePostbackButton”[eval(__doPostBack(postbackButtonClientID,''));] 上的回发。(因此,这模仿了用户单击按钮)。
- AJAX 调用转到服务器,n秒后它返回并导致页面以特定方式更新。
- 然后用户单击链接按钮“btnShowItems”,这会导致回发到服务器,并在n'秒后返回并导致页面以特定方式更新。
用例 #2 - 失败
页面加载,控件“X”中的 JavaScript 计时器激活 LinkButton“CausePostbackButton”上的回发。(因此,这模仿了用户单击按钮)。
在服务器有时间响应之前,用户单击链接按钮“btnShowItems”。
在 FireFox/Firebug 中,您可以看到第一个回发事件是“Aborted”。第二个回发事件完成(您可以看到报告的时间),但页面没有视觉更新。
如果再次单击“手动”按钮,则按预期工作。
我的想法
我知道 JavaScript 是单线程的,所以如果事件不能立即运行,那么它们就会排队。
我知道如果一个计时器触发一个排队的事件,然后在第一个事件仍在排队时触发相同的事件,那么这些事件中的一个(第二个?)将被丢弃。
这就像第一个事件被丢弃一样,但是第二个事件无法再找到要写入的“通道”。
但是,如果我将“手动”链接按钮更改为图像按钮,则行为不会改变。
任何想法是什么问题(理想情况下是解决方案)?
提前谢谢了
格里夫