即使验证无效,ASP.Net文本框也会触发OnTextChanged

时间:2016-02-23 06:27:58

标签: asp.net validation webforms

这是我的代码的简单版本:

<asp:TextBox ID="textBox" runat="server" AutoPostBack="true" OnTextChanged="textChanged" CausesValidation="true" ValidationGroup="valGroup"></asp:TextBox>
<asp:RegularExpressionValidator ID="regEx" runat="server" ControlToValidate="textBox" ValidationGroup="valGroup" ErrorMessage="Not a valid number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />

<asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSaveClick" ValidationGroup="valGroup" />

<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClick="btnCancelClick" CausesValidation="false" />

这是一个带有正则表达式验证器的文本框,它应该将输入限制为只有正实数。当文本发生变化并通过验证时,将调用textChanged()函数。

如果文字无效,textChanged()将无法启动,保存按钮也无效。

这可以按预期工作。

我还有一个取消按钮,它应该只是清除文本框(以及服务器端的其他一些东西)。它应该能够回发到服务器,无论文本框是否有效,因此CausesValidation="false"标记。

我的问题是,当我在文本框中输入无效内容,然后点击取消时,实际上会在 textChanged()之前执行btnCancelClick() 。即使它无效。

这是一个很大的问题,因为textChanged()使用文本框文本作为数字,因此页面会抛出异常。

我不知道是什么导致textChanged()被调用。首先,取消按钮甚至不会调用该功能。正则表达式验证器应该阻止文本框调用它。

编辑:我尝试过进行一些更改和试验。

function cancel()
{

  document.getElementById('<%=textBox.ClientID%>').value = "";

}

<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClientClick="cancel()" CausesValidation="false" />

我切换了取消按钮以调用JavaScript方法来尝试清除文本框。结果很有意思。

当输入无效字符串作为第一件事时,取消按钮工作正常。它会在没有调用textChanged()的情况下清除文本框。

如果我输入有效数字,我会按照预期调用textChanged()。但是,当我点击取消按钮时,它会调用cancel(),然后立即再次调用textChanged(),但现在文本框为空,导致异常。

如果我输入有效的内容,然后使其无效,则会发生类似的事情。调用textChanged()作为有效输入。添加错误输入时,验证程序会阻止调用textChanged()。但是当我点击取消时,它会从cancel()转到textChanged()

我认为可能这是因为验证器不会通过回发持续存在,但使用JavaScript函数cancel()按钮不能导致页面回发。 textChanged()必须是造成它的原因,但我不知道如何。

编辑2:我不打算将此标记解决,因为在我看来这仍然是一个很大的问题,但我找到了解决方法。

<script>

    function cancel() {

        document.getElementById('<%=textBox.ClientID%>').value = "";
        return false;

    }

</script>

<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClientClick="return cancel();" CausesValidation="false" />

这不允许按钮在任何情况下都会引发回发。它正在修复一些不应该存在的东西,但它确实存在。

这有助于点击按钮,但不能与其他内容相关。我有一个带有OnSelectedIndexChanged函数服务器端的GridView。它还会使页面使用textChanged()函数进行回发。我可以尝试创建一个JavaScript版本的GridView函数并像取消按钮一样修复它,但在这个阶段我可能会删除OnTextChanged事件处理程序并放置textChanged()函数并将其放在一个按钮后面。 / p>

2 个答案:

答案 0 :(得分:0)

添加causevalidation =&#34; true&#34;适用于文本框控件。

答案 1 :(得分:0)

如此接近......只需在“取消”按钮上为ValidationGroup名称设置专用名称即可。这将导致它与剩余的验证一起处理循环。没有设置它有效地把它放在“默认”验证组中,行为(如你所见),有点奇怪。

要允许取消按钮免于表单验证的其余部分,我通常应用的规则是[ValidationGroupName]Cancel,以确保它在该验证块之外触发。在这种情况下,将取消按钮设置为类似;

<asp:Button ID="btnCancel" runat="server" Text="Cancel" ValidationGroup="valGroupCancel" OnClick="btnCancelClick" />

应该给你预期的行为。