在操作完成之前单击另一个按钮

时间:2013-06-17 14:55:26

标签: asp.net ajax asp.net-ajax

我有一个asp.net网页,有两个按钮。它们位于两个不同的update panels中,并更新两个不同的文本框。

我首先点击第一个按钮,等待5秒钟,然后点击第二个按钮。我所期望的结果是两个文本框都有价值 - 但只有一个有。

问题

  1. 为什么第一个文本框没有更新?当我点击第二个按钮时,第一个请求是否被中止?任何msdn参考?
  2. 即使我们在第一次完成之前点击第二个按钮,我们是否还能在两个文本框中获取值?
  3. MARKUP

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxTest.aspx.cs" Inherits="MyUI.AjaxTest"
    EnableSessionState="False" %>
    
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="scrSubscribers" runat="server" />
    <div>
        <div style="border-style: solid; border-color: #00FFFF">
            <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Always">
                <ContentTemplate>
                    <div class="firstTextBox">
                        <asp:TextBox ID="txtAssociateName" runat="server" Width="150px" MaxLength="81" TabIndex="1"></asp:TextBox>
                    </div>
                </ContentTemplate>
            </asp:UpdatePanel>
            <br />
            <asp:UpdatePanel ID="UpdatePanel4" runat="server" UpdateMode="Always">
                <ContentTemplate>
                    <div class="firstTextBox">
                        <asp:TextBox ID="txtDepartment" runat="server" Width="150px" MaxLength="81" TabIndex="1"></asp:TextBox>
                    </div>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
        <br />
        <br />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="UpdatePanel1_Load" UpdateMode="Conditional">
            <ContentTemplate>
                <div id="searchValues" class="searchValuesDiv">
                    <div id="searchLine1" class="searchLine">
                    </div>
                    <div id="searchLine5" class="searchLine">
                        <div class="btnSearchDiv">
                            <asp:Button ID="btnFirst" class="btnSearch" runat="server" OnClick="SearchSubscribersClick"
                                Text="FirstButton" ValidationGroup="Search" />
                            <asp:TextBox ID="txtFirstDate" runat="server" Width="150px" MaxLength="81" TabIndex="1"></asp:TextBox>
                        </div>
                    </div>
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
        <br />
        <br />
        <asp:UpdatePanel ID="UpdatePanel2" runat="server" OnLoad="UpdatePanel1_Load" UpdateMode="Conditional">
            <ContentTemplate>
                <div id="Div1" class="searchValuesDiv">
                    <div id="Div3" class="searchLine">
                        <div class="btnSearchDiv">
                            <asp:Button ID="btnSecond" class="btnSearch" runat="server" OnClick="SecondClick"
                                Text="SecondButton" ValidationGroup="Search" />
                            <asp:TextBox ID="txtSecondDate" runat="server" Width="150px" MaxLength="81" TabIndex="1"></asp:TextBox>
                        </div>
                    </div>
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:HiddenField ID="hdnSearchClickStatus" runat="server" Value="Blank Value" />
    </div>
    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script src="Scripts/ExpandableSearchResultScript.js" type="text/javascript"></script>
    </form>
    </body>
    </html>
    

    代码背后

        protected void SearchSubscribersClick(object sender, EventArgs e)
        {
            Thread.Sleep(10000);
            txtAssociateName.Text = "A_"+ DateTime.Now.ToString();
        }
    
        protected void SecondClick(object sender, EventArgs e)
        {
            Thread.Sleep(10000);
            txtDepartment.Text = "B_" + DateTime.Now.ToString();
        }
    

    RESULT

    enter image description here

2 个答案:

答案 0 :(得分:1)

发出新请求时,任何AJAX请求都会被取消。这不是来自MSDN。这就是AJAX请求的工作方式。

答案 1 :(得分:0)

答案可以来自问题ASP.NET AJAX using UpdatePanels

@Sergey评论:

  

UpdatePanel的请求仍在整个页面生命周期中运行。因此,存在与每个请求相关联的状态数据。这就是为什么两个请求不能同时为同一个会话运行的原因。作为Jquery ajax请求命中无状态静态方法。

@Dave Ward回答:

  

UpdatePanel的异步回发仍然只是:回发。如果允许并行发生多个回发,则他们的新ViewState通常会彼此不同步。然后,下一个回发将抛出一个ViewState验证错误和/或在第三次回发完成后,其中一个回发对Page的状态的修改将会丢失。

     

另一方面,页面方法和Web服务调用不受WebForms ViewState或页面生命周期的阻碍。因此,由于浏览器的同时请求限制允许(通常为4-8,但在IE6等某些浏览器中仅为2),因此许多可能并行发生。