User.aspx页面点击按钮提交,执行User.aspx.cs代码页btnSave_Click事件,数据没提交完成之前,重复点击按钮无效的案例(完整代码)
时间: 2024-11-25 22:14:26 浏览: 5
在ASP.NET中,为了防止用户在数据未成功提交前重复点击按钮导致并发问题,我们通常会在服务器端处理按钮点击事件,并利用异步或线程同步机制保证操作的原子性。这里是一个简单的示例,我们将使用`Async Void`模式和`Lock`关键字来模拟这种场景:
首先,在User.aspx页面上,我们需要创建一个按钮并设置其PostBackUrl属性为自身(以便触发CS文件中的事件):
```html
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="User.aspx.cs" Inherits="YourNamespace.User" %>
<!DOCTYPE html>
<html>
<head runat="server">
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="btnSave" Text="保存" runat="server" OnClick="btnSave_Click" PostBackUrl="~/User.aspx"/>
</form>
</body>
</html>
```
然后,在User.aspx.cs文件中,添加`btnSave_Click`事件处理,使用异步方法和锁定对象:
```csharp
using System;
using System.Threading;
public partial class User : System.Web.UI.Page
{
private object _saveLock = new object();
protected async void btnSave_Click(object sender, EventArgs e)
{
try
{
// 获取锁定,确保只有一个请求可以执行保存操作
lock (_saveLock)
{
if (IsPostBack)
{
// 模拟数据库操作,实际上应该连接到数据库并执行保存
await Task.Delay(5000); // 异步等待5秒
// 提交操作后,释放锁,允许其他请求继续
Response.Redirect("SuccessPage.aspx");
}
else
{
Label1.Text = "请先点击按钮!";
}
}
}
catch (Exception ex)
{
Label1.Text = "保存失败:" + ex.Message;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!IsPostBack && !Page.IsPostBackEventRegistered(btnSave.UniqueID))
{
// 如果首次加载并且尚未注册Postback事件,则添加事件监听
btnSave.Click += btnSave_Click;
}
}
}
阅读全文