【问题标题】:Prevent duplicate postback in ASP.Net (C#)防止在 ASP.Net (C#) 中重复回发
【发布时间】:2011-04-04 17:44:30
【问题描述】:

这里很简单...有没有一种干净的方法可以防止用户双击 Web 表单中的按钮,从而导致重复事件触发?

例如,如果我有一个评论表单,并且用户输入“这是我的评论”并点击提交,评论将显示在下面...但是如果他们双击、三次单击或只是在它们可能会导致发布多个版本。

客户端我可以很容易地禁用按钮 onclick - 但我更喜欢服务器端解决方案,而不是这样的事情:)

是否可以设置每个视图状态的回发超时?

谢谢

【问题讨论】:

    标签: c# asp.net postback


    【解决方案1】:

    我认为您不应该为这些琐碎的任务加载服务器。您可以尝试一些 jquery UI 阻塞解决方案,例如 this 之一。 Microsoft Ajax 工具包也应该有一些做同样的控制。我很久以前用过它,但似乎无法回忆起控件名称。

    【讨论】:

    • 链接好像失效了。
    【解决方案2】:

    使用 jQuery,您可以使用 one 事件。

    另一个有趣的阅读是:Build Your ASP.NET Pages on a Richer Bedrock

    【讨论】:

      【解决方案3】:

      在用户进入页面时设置会话变量,如 Session["FormXYZSubmitted"]=false。 提交表单时检查变量,如

      if((bool) Session["FormXYZSubmitted"] == false) {
         // save to db
         Session["FormXYZSubmitted"] = true;
      }
      

      【讨论】:

      • 你也可以在按钮点击事件中做到这一点
      【解决方案4】:

      如果您使用 Asp.Net 验证,客户端可能会很棘手。

      如果您有母版页,请将其放在母版页中:

       void IterateThroughControls(Control parent)
          {
              foreach (Control SelectedButton in parent.Controls)
              {
                  if (SelectedButton is Button)
                  {
                      ((Button)SelectedButton).Attributes.Add("onclick", " this.disabled = true; " + Page.ClientScript.GetPostBackEventReference(((Button)SelectedButton), null) + ";");
                  }
      
                  if (SelectedButton.Controls.Count > 0)
                  {
                      IterateThroughControls(SelectedButton);
                  }
              }
          }
      

      然后将其添加到母版页 Page_Load:

      IterateThroughControls(this);
      

      【讨论】:

        【解决方案5】:

        我也遇到过同样的情况。我的一个同事的解决方案是在 Javascript 中实现一种 Timer,以避免将第二次点击视为点击。

        希望对你有帮助,

        【讨论】:

          【解决方案6】:

          禁用单击按钮,使用 jquery 或 microsoft ajax 工具包。

          【讨论】:

            【解决方案7】:

            根据这对您的重要性,可以创建一个包含一次性 GUID 的数组,您可以在处理完更新后将其从数组中删除(即在视图状态/隐藏字段中回发)

            如果回发时 guid 不在数组中,则请求无效。

            在集群环境中用数据库表替换数组。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-03-11
              • 1970-01-01
              • 1970-01-01
              • 2013-09-09
              • 2011-05-03
              相关资源
              最近更新 更多