4

我有一个带有两个回发事件的 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 - 成功

  1. 页面加载,控件“X”中的 JavaScript 计时器激活 LinkBut​​ton“CausePostbackButton”[eval(__doPostBack(postbackButtonClientID,''));] 上的回发。(因此,这模仿了用户单击按钮)。
  2. AJAX 调用转到服务器,n秒后它返回并导致页面以特定方式更新。
  3. 然后用户单击链接按钮“btnShowItems”,这会导致回发到服务器,并在n'秒后返回并导致页面以特定方式更新。

用例 #2 - 失败

  1. 页面加载,控件“X”中的 JavaScript 计时器激活 LinkBut​​ton“CausePostbackButton”上的回发。(因此,这模仿了用户单击按钮)。

  2. 在服务器有时间响应之前,用户单击链接按钮“btnShowItems”。

  3. 在 FireFox/Firebug 中,您可以看到第一个回发事件是“Aborted”。第二个回发事件完成(您可以看到报告的时间),但页面没有视觉更新。

  4. 如果再次单击“手动”按钮,则按预期工作。

我的想法

  • 我知道 JavaScript 是单线程的,所以如果事件不能立即运行,那么它们就会排队。

  • 我知道如果一个计时器触发一个排队的事件,然后在第一个事件仍在排队时触发相同的事件,那么这些事件中的一个(第二个?)将被丢弃。

  • 这就像第一个事件被丢弃一样,但是第二个事件无法再找到要写入的“通道”。

但是,如果我将“手动”链接按钮更改为图像按钮,则行为不会改变。

任何想法是什么问题(理想情况下是解决方案)?

提前谢谢了

格里夫

4

1 回答 1

3

正如迪克兰帕德建议的那样,我们直接联系了 Telerik。他们立即提出了解决方案:

按照设计,如果您在收到第一个响应之前尝试启动另一个 ajax 请求,ASP.NET AJAX 框架会取消正在进行的 ajax 请求。例如,将 RadAjaxPanel 的 RequestQueueSize 设置为 3...

那行得通!

于 2011-07-28T21:02:08.020 回答