使用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");
}
}
删除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");