怎么办延迟回发?

时间:2012-04-13 22:36:25

标签: asp.net

我在假设页面上有5个复选框,如果选中其中任何一个,我想执行回发。但是,我想稍稍延迟回发,以便如果用户选中一个方框,它会等待一秒左右,以确保用户在进行往返服务器之前不想检查更多的方框。所以,如果你快速连续检查了所有五个,你就可以在回发发送之前检查所有五个。

有没有人这样做过,看过这件事,知道怎么做,或者有充分理由不这样做?

4 个答案:

答案 0 :(得分:7)

你没有说你使用的是jQuery,但为了讨论和清晰起见,我会假设它是可用的。这方面的内容应该适合你:

var timeout = null;

// Set up code to respond to when the checkbox is checked/unchecked
$('input[type="checkbox"]').change(function() {
    // If this is the second check box in a row, clear previous timeout
    if (timeout != null) 
        clearTimeout(timeout);

    // Set a timeout that will fire in 5 seconds 
    timeout = setTimeout(function() {
          // Post back the form
        __doPostBack();
    }, 5000);
});

答案 1 :(得分:7)

为什么不将AutoPostBack="false"放在复选框上,然后通过按钮触发回发?这样,用户就有机会检查他们想要的所有内容,并在需要时提交结果。


由于您对1回按对用户的反直觉的评论,为什么不在UpdatePanel中包装每个复选框?它可能会更多一些标记,但它可以完全按照您的意愿执行而无需执行“延迟回发”方案。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox3" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel4" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox4" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox5" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

答案 2 :(得分:2)

  

有没有人这样做过,看过这件事,知道怎么做,或者   有充分的理由不去做吗?

我会反对任何重新加载或修改页面结构的延迟操作。原因如下:

原因#1
人们使用各种输入法以极快的速度点击。

原因#2
行为应该是一致的,不受只有你知道的隐藏规则的约束。有时用户训练有素,可以利用优化,但大部分时间都没有。

原因#3
结构更改(尤其是异步执行的更改)可能会撤消后续操作。

示例:

  • 用户选中一个方框。
  • 页面在短暂延迟后异步回发。
  • 用户取消选中同一个框。
  • 异步回发完成,重新检查该框。

这是任何异步回发的设计考虑因素,但延迟使其更不直观。

<强>替代
如果操作要求在回发发生时执行整个生命周期,那么我会主张立即执行回发。

如果操作不需要执行页面的整个生命周期,我建议在后台使用某种AJAX调用执行逻辑并完全消除回发。然后,您可以使用结果值更新浏览器(如有必要)。

答案 3 :(得分:0)

我也遇到过这个问题。我设法使用存储在隐藏字段中的标志来使其工作。考虑一下:

<%-- SomePage.aspx --%>
<asp:HiddenField ID="checkboxClicked" runat="server" Value="false" />

<asp:CheckBox ID="checkBox1" runat="server" Text="Check 1" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox2" runat="server" Text="Check 2" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox3" runat="server" Text="Check 3" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox4" runat="server" Text="Check 4" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox5" runat="server" Text="Check 5" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />

<%
    protected void OnCheckBoxClick(object sender, EventArgs args)
    {
        // Your code here...

        checkboxClicked.Value = "false";
    }
%>

<script type="text/javascript">

    function onCheckboxClick() {
        var canPostBack = true;

        if ($('#checkboxClicked').val() === 'true') {
            canPostBack = false;
        }
        else {
            $('#checkboxClicked').val('true');
            canPostBack = true;
        }

        return canPostBack;
    }

</script>