使用LinkButton OnClick时防止重复

本文关键字:LinkButton OnClick 使用 | 更新日期: 2023-09-27 18:05:57

当两个人同时点击链接按钮时,它允许一个人然后阻止另一个人?我有一个表单,人们为自己申请记录,但问题是人们几乎在同一时间点击LinkButton,然后它继续到他们的下一页,他们都认为记录是他们的。

ASP。净

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
   <ContentTemplate>
       <asp:Repeater ID="waitingRep" OnItemDataBound="waitingRep_ItemDataBound" 
       OnPreRender="waitingRep_PreRender" OnItemCommand="waitingRep_ItemCommand" 
       runat="server">
         <ItemTemplate>
            <asp:LinkButton ID="claimBtn" OnClick="claim" CommandArgument='<%# Eval("ID") %>' runat="server">
            Claim
            </asp:LinkButton>
         </ItemTemplate>
      </asp:Repeater>
   </ContentTemplate>
</asp:UpdatePanel>

背后的代码
protected void claim(object sender, EventArgs e)
{
        var location = Request.Params["lid"];
        string logon_user = Request.LogonUserIdentity.Name.Substring(7);
        LinkButton claimButton = (LinkButton)(sender);
        int currentID = Convert.ToInt32(claimButton.CommandArgument);
        bool isTaken = false;
        using (SqlConnection conn = new SqlConnection(""))
        {
            SqlCommand cmd = new SqlCommand(@"SELECT COUNT(*) as isTaken FROM ClaimList WHERE ID = '" + currentID + "' AND Status = 2", conn);
            conn.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                if (Convert.ToInt32(rdr["isTaken"]) > 0) isTaken = true;
            }
            rdr.Close();
        }
        if (!isTaken)
        {
            using (SqlConnection conn = new SqlConnection(""))
            {
                SqlCommand cmd = new SqlCommand(@"UPDATE ClaimList set Status=@f1, ClaimedBy=@f2, ClaimedDate=@f3 where ID=@f4", conn);
                conn.Open();
                cmd.Parameters.Add("@f1", SqlDbType.Int).Value = 2;
                cmd.Parameters.Add("@f2", SqlDbType.Int).Value = logon_user;
                cmd.Parameters.Add("@f3", SqlDbType.DateTime).Value = DateTime.Now.ToString();
                cmd.Parameters.Add("@f4", SqlDbType.Int).Value = currentID;
                cmd.ExecuteNonQuery();
            }
            Response.Redirect("View.aspx?id=" + currentID);
        }
        else
        {
            Response.Redirect("Location.aspx?lid=" + location + "&action=taken");
        }
}

使用LinkButton OnClick时防止重复

删除select并在更新中添加一个额外的条件,以避免在已经使用的情况下更新,如下所示:

        bool isTaken = false;
        using (SqlConnection conn = new SqlConnection(""))
        {
            SqlCommand cmd = new SqlCommand(@"UPDATE ClaimList set Status=@f1, ClaimedBy=@f2, ClaimedDate=@f3 where ID=@f4 AND Status <> 2", conn);
            conn.Open();
            cmd.Parameters.Add("@f1", SqlDbType.Int).Value = 2;
            cmd.Parameters.Add("@f2", SqlDbType.Int).Value = logon_user;
            cmd.Parameters.Add("@f3", SqlDbType.DateTime).Value = DateTime.Now.ToString();
            cmd.Parameters.Add("@f4", SqlDbType.Int).Value = currentID;
            if (cmd.ExecuteNonQuery() == 0)
                 isTaken = true;
        }
        if (!isTaken)
             Response.Redirect("View.aspx?id=" + currentID);
        else
             Response.Redirect("Location.aspx?lid=" + location + "&action=taken");