ASP.NET - Button的客户端OnClick事件正在打破页面验证

时间:2009-08-17 20:41:17

标签: javascript asp.net validation

我在表单上有一个按钮,可以为我的数据库保存一个唯一值,并防止用户提交两次并收到错误我添加了一些JavaScript逻辑,以便在单击按钮后对该按钮进行客户端禁用。在功能上这一切都有效,但它产生了一个意想不到的副作用,即在一个控件上触发了字段验证,该控件具有与我提交的验证组完全不同的验证组。如果我删除自定义的OnClick属性,页面的行为将再次出现。如果你看一下this article中的第3项,你会发现其他人也注意到了这个问题。

仔细测试问题后,我注意到确切的问题是将按钮更改为客户端中的disabled = true。鉴于这种困境,我不得不采用服务器端解决方案解决我所面临的问题,但我不禁想知道为什么会发生这种情况。这是ASP.NET中的错误吗?

如果您想确切知道发生了什么,请点击此处an example,以下是代码:

<%@ Page Language="C#" %>

<script runat="server" language="C#">
    void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            this.Button1.Attributes["onclick"] = string.Format("DisableOnSubmit('{0}','{1}');", this.Button1.ClientID, this.Button1.ValidationGroup);
        }
    }

</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script type="text/javascript">
        function DisableOnSubmit(btn, group) {
            if (btn && group) {
                if (Page_ClientValidate(group)) {
                    var btnElement = document.getElementById(btn);
                    if (btnElement) {
                        btnElement.disabled = true;
                        btnElement.value = 'Saving...';
                    }
                }
            }
        }
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server" ValidationGroup="group1">Initial Value</asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="This should come up if the first field is empty."
            ValidationGroup="group1" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
        <asp:Button ID="Button1" runat="server" Text="Click Me!" ValidationGroup="group1" />
        <br />
        <br />
        <asp:TextBox ID="TextBox2" runat="server" ValidationGroup="group2"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="You shouldn't ever see me."
            ValidationGroup="group2" ControlToValidate="TextBox2"></asp:RequiredFieldValidator>
    </div>
    </form>
</body>
</html>

2 个答案:

答案 0 :(得分:1)

我总是在ASP.Net中找到一些脆弱和错误的东西,但它在大多数时候都很棒。也许这只是其中之一......或者我只是没有看到什么是错的。

无论哪种方式,我通常都使用服务器端代码来控制你正在尝试的事情。因为它的功能很好。

答案 1 :(得分:1)

这里猜对了,但是你的函数DisableOnSubmit没有返回任何值。 onclick事件处理程序通常需要true或false。我也遇到了生成页面重新加载的按钮问题,因为onclick事件中的javascript无法正常工作。综合考虑这些因素,单击按钮是否可能只是重新加载而不是回发?尝试从javascript返回true来测试它。

另外,Page_ClientValidate会有任何副作用吗?