【问题标题】:ASP.Net textbox OnTextChanged firing even though validation is invalid即使验证无效,ASP.Net 文本框 OnTextChanged 也会触发
【发布时间】:2016-06-04 20:47:44
【问题描述】:

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

<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() 函数回发。我可以尝试创建 GridView 函数的 JavaScript 版本并像取消按钮一样修复它,但在这个阶段我可能会删除 OnTextChanged 事件处理程序并将textChanged() 函数放在按钮后面。

【问题讨论】:

    标签: asp.net validation webforms


    【解决方案1】:

    add Causesvalidation="true" 在文本框控件上为我工作。

    【讨论】:

    • 抱歉,如果您查看我的示例代码,我确实已经在文本框上有了 Causevalidation="true"。我刚才跑了,还是不行。
    【解决方案2】:

    如此接近...所需的只是在“取消”按钮上为ValidationGroup 名称设置一个专用名称。这将导致它与验证的其余部分不循环处理。未有效设置它会将其置于行为(如您所见)的“默认”验证组中,有点奇怪。

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

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

    应该给你你预期的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2011-02-11
      • 2011-04-25
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多