防止ASP.Net中的重复回发(C#)

时间:2010-08-27 10:27:55

标签: c# asp.net postback

这里简单一点......是否有一种干净的方法可以阻止用户双击网络表单中的按钮,从而导致重复的事件被触发?

如果我有一个评论表格,例如用户输入“这是我的评论”并点击提交,则评论如下所示...但是,如果他们双击,三击或只是坚持键盘可以导致发布多个版本。

客户端我可以很容易地禁用按钮onclick - 但我更喜欢服务器端解决方案,如下所示:)

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

由于

7 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

当用户进入Session [“FormXYZSubmitted”] = false之类的页面时设置会话变量。 提交表单时,请检查该变量,如

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

答案 3 :(得分:0)

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

希望有所帮助,

答案 4 :(得分:0)

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

答案 5 :(得分:0)

根据这对您的重要程度,可以创建一次性GUID的数组,一旦处理完更新,您就会从数组中删除它(即在viewstate / hidden字段中回发)

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

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

答案 6 :(得分:0)

如果您使用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);