none
asp.net ajax 取消异步回送 RRS feed

  • 问题

  • 谁能帮我看一下。。点击button1向数据库中插入一条数据,并绑定到gridview1,更新updatepanel1,在更新时我点击“取消”来取消异步回送。结果数据照样插入到表中,页面不更新了。我想要的效果是当点击“取消”的时候就不像数据库中增加数据。。怎么实现?

    protected void Button1_Click1(object sender, EventArgs e)
        {
            System.Threading.Thread.Sleep(3000);
             string connstr=WebConfigurationManager.ConnectionStrings["mingcai_user_conn"].ConnectionString;
             SqlConnection conn = new SqlConnection(connstr);
             try
             {
                 conn.Open();
                 SqlCommand cmd = new SqlCommand("o_income", conn);
                 cmd.CommandType = CommandType.StoredProcedure;
                 cmd.Parameters.AddWithValue("@Tname", 0);
                 cmd.Parameters.AddWithValue("@userId", "9a23d3d4-c541-4d5b-9faa-f9a8cb10d505");
                 cmd.Parameters.AddWithValue("@inname", "哈哈");
                 cmd.Parameters.AddWithValue("@tmoney", "1234567");
                 cmd.Parameters.AddWithValue("@inwhere", "小金库");
                 cmd.Parameters.AddWithValue("@tdate", "2012-7-8");
                 cmd.Parameters.AddWithValue("@mood", "shuang");
                 cmd.Parameters.AddWithValue("@remark", "ceshi");
                 cmd.ExecuteNonQuery();
                 GridView1.DataBind();
             }
             catch (Exception ex)
             {
                 Label1.Text = ex.Message;
             }
        }

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
      <ContentTemplate>
          <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
          <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
              DataKeyNames="id" DataSourceID="SqlDataSource2">
              <Columns>
                  <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" 
                      ReadOnly="True" SortExpression="id" />
                  <asp:BoundField DataField="userid" HeaderText="userid" 
                      SortExpression="userid" />
                  <asp:BoundField DataField="in_name" HeaderText="in_name" 
                      SortExpression="in_name" />
                  <asp:BoundField DataField="tmoney" HeaderText="tmoney" 
                      SortExpression="tmoney" />
                  <asp:BoundField DataField="inwhere" HeaderText="inwhere" 
                      SortExpression="inwhere" />
                  <asp:BoundField DataField="tdate" HeaderText="tdate" SortExpression="tdate" />
                  <asp:BoundField DataField="mood" HeaderText="mood" SortExpression="mood" />
                  <asp:BoundField DataField="remark" HeaderText="remark" 
                      SortExpression="remark" />
                  <asp:BoundField DataField="insert_time" HeaderText="insert_time" 
                      SortExpression="insert_time" />
              </Columns>
          </asp:GridView>
    
          <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
              ConnectionString="Data Source=DEVELOP-SERVER\OCHENGSHI;Initial Catalog=mingcai_database1;User ID=mc_admin" 
              ProviderName="System.Data.SqlClient" SelectCommand="SELECT * FROM [income]">
          </asp:SqlDataSource>
    
      </ContentTemplate>
      <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Button1" EventName="click" />
        <asp:AsyncPostBackTrigger ControlID="Button2" EventName="click" />
      </Triggers>
    </asp:UpdatePanel>
    <asp:Button ID="Button1" runat="server" Text="Button" 
        onclick="Button1_Click1" />
    <asp:Button ID="Button2"
        runat="server" Text="取消" OnClientClick="abortTask()" />
    
    <script type="text/javascript">
    function abortTask()  {
        var obj = Sys.WebForms.PageRequestManager.getInstance();
        if (obj.get_isInAsyncPostBack())
            obj.abortPostBack();
        alert("终止!");
    }
    </script>

    2012年7月26日 17:17

答案

全部回复

  • 你好,可以考虑这样的设计。

    因为一旦请求发送,服务器收到这个请求后就在一个线程里处理数据库操作。如果你要取消,那么需要在服务端设置一个变量,在进行数据库操作的时候,先等待一段时间。如果这个时间内那个变量没有变化,则进行操作。当“取消”执行的时候,实际上要做的事情就是到服务端修改这个变量,修改好之后,如果之前的线程发现变量改变了,那么就不执行数据库操作。

    当然,你也可以考虑把数据库操作放进一个队列中,当一段时间没有“取消”时,进行插入。

    2012年7月30日 14:11
    版主
  • 谢谢,我直接就把“取消功能”给取消了。。。嘿嘿

    2012年7月31日 18:37