ASP.Net双击问题

我的ASP.net页面有一点问题。 如果用户双击“提交”按钮,它将两次写入数据库(即在图像按钮上执行两次’onclick’方法)

如何使用,如果用户点击图像按钮,只是图像按钮被禁用?

我试过了:

 

但是这个OnClientClick属性完全阻止了页面的提交! 有帮助吗?

对不起,是的,我确实有validation控件…因此这个问题很棘手。


到目前为止,还在努力解决这个问题:

ASP代码:

   ...  

C#代码:

  private Random random = new Random(); protected void Page_Load(object sender, EventArgs e) { //Use a Token to make sure it has only been clicked once. if (Page.IsPostBack) { if (double.Parse(hidToken.Text) == ((double)Session["NextToken"])) { InputMethod(); } else { // double click } } double next = random.Next(); hidToken.Text = next + ""; Session["NextToken"] = next; 

实际上……这几乎可行。 双击问题几乎是固定的(耶!)虽然图像仍然没有被隐藏。

一般方法是双重的。

Serverside

  1. 在加载页面时,生成一个令牌(使用System.Random ),将其保存在会话中,并将其写入隐藏的表单字段
  2. 在提交时,检查隐藏的表单字段是否等于会话变量( 再次设置之前
  3. 做工作

客户

与您拥有的相似,但可能只是隐藏按钮,并将其替换为“提交”等文本。

客户方面需要注意的重要一点是,用户可以通过点击“转义”来取消post,因此你应该考虑在这里做什么(取决于它们不会使用多少令牌,所以你’我需要将按钮从禁用/隐藏状态恢复。

完整示例如下:

C#(包括在行动中查看它的代码):

   double-click test     
Result: 

如果您在页面上进行了validation,则禁用按钮客户端会变得有点棘手。 如果validation失败,您不想禁用该按钮。 这是一个添加客户端事件处理程序的代码段:

 private void BuildClickOnceButton(WebControl ctl) { System.Text.StringBuilder sbValid = new System.Text.StringBuilder(); sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { "); sbValid.Append("if (Page_ClientValidate() == false) { return false; }} "); sbValid.Append(ctl.ClientID + ".value = 'Please wait...';"); sbValid.Append(ctl.ClientID + ".disabled = true;"); // GetPostBackEventReference obtains a reference to a client-side script // function that causes the server to post back to the page. sbValid.Append(ClientScript.GetPostBackEventReference(ctl, "")); sbValid.Append(";"); ctl.Attributes.Add("onclick", sbValid.ToString()); } 

有关详细信息,请参阅此asp.net线程 。

更新 :上面的代码将用于在代码后面添加OnClientClick处理程序。 您也可以在您的aspx标记中编写javascript,如下所示:

   

我通过在点击服务器之前在客户端点击上设置隐藏字段来解决这个问题。

然后在服务器中我检查隐藏字段,如果值是例如’FALSE’那可能意味着我可以或不可以操作。

与Silky的客户端响应类似,我通常制作两个看起来相似的按钮,只是第二个按钮被禁用和隐藏。 正常按钮的OnClientClick交换两个按钮的显示样式,以便隐藏正常按钮并显示禁用按钮。

双击function是服务器端实现,以防止处理可以通过JavaScript在客户端实现的相同请求。 该function的主要目的是防止两次处理相同的请求。 服务器端实现通过识别重复请求来完成此操作; 但是,理想的解决方案是防止在客户端发生这种情况。

在发送给客户端的HTML内容中,允许他们提交请求,可以使用一个小的validationJavaScript来检查请求是否已经提交,如果是,则阻止在线购物者再次提交请求。 此JavaScriptvalidation函数将检查全局标志以查看是否已提交请求,如果已提交; 不会重新提交请求。 如果在服务器上禁用了双击function,则强烈建议JSP和HTML页面实现此JavaScript预防。

以下示例通过使用表单对象的onSubmit()操作来阻止表单提交多次:

 ...  ... 
......

对于那些只想快速修复的人,只需隐藏它并显示另一个没有事件的按钮