我有2个更新面板,两个更新面板都设置为UpdateMode =“Conditional”。
第一个更新面板包含:
第一个更新面板将2个SliderExtender文本框的TextChanged事件设置为异步回发触发器。
<Triggers>
<asp:AsyncPostBackTrigger ControlID="tb_Slider1" EventName="TextChanged" />
<asp:AsyncPostBackTrigger ControlID="tb_Slider2" EventName="TextChanged" />
</Triggers>
第二个更新面板包含:
第二个更新面板通过后面的代码加载标签中的文本。第二个更新面板将Timer的Tick事件设置为async post back触发器。
<Triggers>
<asp:AsyncPostBackTrigger ControlID="tm_Timer1" EventName="Tick" />
</Triggers>
如果我在第一个更新面板中滚动任一个滑块,则第二个更新面板中的计时器会打勾;滑块自行下降,进而导致TextChanged事件触发。
为什么部分帖子会在第二个更新面板中返回,导致第一个更新面板控件做出反应?
我一直在刷新更新面板,看起来部分帖子更像是完整的帖子后备,因为它们运行所有服务器页面生命周期事件。我不确定这是否会导致滑块出现故障?
无论如何要避免这种情况吗?还是“按预期工作”?
最终我希望能够自由移动滑块,即使计时器正在滴答作响。这样定时器更新面板会经常更新,当用户放下滑块控件(即TextChanged)时,第一个更新面板将会更新。
答案 0 :(得分: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>