ASP.Net textbox OnTextChanged激发,即使验证无效

ASP.Net textbox OnTextChanged激发,即使验证无效,asp.net,validation,webforms,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" ControlT

以下是我的代码的简单版本:

<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" />
我切换了cancel按钮以调用JavaScript方法来尝试清除文本框。结果有点有趣

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

如果我键入一个有效的数字,
textChanged()
将按预期调用。但是,当我单击cancel按钮时,它确实调用了
cancel()
,然后立即再次调用
textChanged()
,但现在文本框为空,导致异常

如果我输入有效的内容,然后使其无效,则会发生类似的情况<为有效输入调用code>textChanged()。添加不正确的输入时,验证程序会阻止调用
textChanged()
。但当我单击cancel时,它会从
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" />

函数cancel(){
document.getElementById(“”).value=“”;
返回false;
}
这不允许按钮在任何情况下导致回发。它正在修复一些本来不应该存在的东西,但它确实存在


这有助于按钮点击,但对其他事情没有帮助。我有一个GridView,服务器端有一个OnSelectedIndexChanged函数。它还会导致页面使用
textChanged()
函数发回。我可以尝试创建GridView函数的JavaScript版本,并像取消按钮一样修复它,但在这个阶段,我可能会删除ContextChanged事件处理程序,并将
textChanged()
函数放在按钮后面。

add causesvalidation=“true”在textbox控件上对我有效

如此接近。。。只需在“取消”按钮上为
ValidationGroup
名称设置一个专用名称即可。这将导致它与其余的验证一起被处理出周期。没有有效地设置它会将其放入“默认”验证组,其行为(如您所见)有点奇怪

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

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


应该给出您的预期行为。

很抱歉,如果您查看我的示例代码,我的文本框中已经有causesvalidation=“true”。我刚刚运行了它,但它仍然不工作。
<asp:Button ID="btnCancel" runat="server" Text="Cancel" ValidationGroup="valGroupCancel" OnClick="btnCancelClick" />