1

我有 2 个更新面板,两个更新面板都设置为 UpdateMode="Conditional"。

第一个更新面板包含:

  • 2 AJAX 工具包 SliderExtender
  • 2 对应的文本框

第一个更新面板将 2 个 SliderExtender 文本框的 TextChanged 事件设置为异步回发触发器。

<Triggers>
    <asp:AsyncPostBackTrigger ControlID="tb_Slider1" EventName="TextChanged" />
    <asp:AsyncPostBackTrigger ControlID="tb_Slider2" EventName="TextChanged" />
</Triggers>

第二个更新面板包含:

  • 3 个标签
  • 间隔为 1 秒的计时器

第二个更新面板通过后面的代码加载标签中的文本。第二个更新面板将 Timer's Tick 事件设置为异步回发触发器。

<Triggers>
     <asp:AsyncPostBackTrigger ControlID="tm_Timer1" EventName="Tick" />
</Triggers>

如果我滚动第一个更新面板中的任何一个滑块,因为第二个更新面板中的计时器滴答作响;滑块会自行下降,进而触发 TextChanged 事件。

为什么第二个更新面板中的部分回帖会导致第一个更新面板控件做出反应?

我一直在更新更新面板,看起来部分回帖更像是完整的回帖,因为它们运行所有服务器页面生命周期事件。我不确定这是否会导致滑块出现故障?

有没有办法避免这种情况?还是“按预期工作”?

最终,即使计时器在滴答作响,我也希望能够自由移动滑块。这样定时器更新面板会经常更新,当用户放下滑块控件(即TextChanged)时,第一个更新面板将被更新。

4

1 回答 1

1

尽管tm_Timer1没有添加到第一个 updatepanel 的触发器集合中,但当它打勾时,提交给服务器的所有表单控件的值(包括文本框值和第一个 UpdatePanel)也会刷新。您可以在 ScriptManager 控件之后添加脚本来解决此问题:

<script type="text/javascript">
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);

     var realDoPostback = __doPostBack;
     __doPostBack = function (sender, args) {
          if (sender === "<%= tm_Timer1.UniqueID %>") {
               $get("<%= tb_Slider1.ClientID  %>").removeAttribute("name");
               $get("<%= tb_Slider2.ClientID  %>").removeAttribute("name");
          }
          realDoPostback(sender, args);
     }

     function endRequestHandler(sender, args) {
          $get("<%= tb_Slider1.ClientID  %>").setAttribute("name", "<%= tb_Slider1.UniqueID %>");
          $get("<%= tb_Slider2.ClientID  %>").setAttribute("name", "<%= tb_Slider2.UniqueID %>");
     }
</script>
于 2012-05-30T14:58:01.333 回答