【问题标题】:Stop postback on TextChanged在 TextChanged 上停止回发
【发布时间】:2010-12-04 05:08:37
【问题描述】:

我在一个附加了 TextChanged 事件的 aspx 页面中有一个文本框。 我还有一个附加到文本框的验证器。

当文本改变时,验证触发,但如果出现错误,仍然会调用 textchanged 事件。如果验证器触发,您知道是否可以停止 textchanged 上的回发?

<asp:TextBox ID="txtQuantity" runat="server" AutoPostBack="true" ontextchanged="txtQuantity_TextChanged"></asp:TextBox>
<asp:RequiredFieldValidator ID="reqQuantity" ControlToValidate="txtQuantity" runat="server" ErrorMessage="The quantity is mandatory."></asp:RequiredFieldValidator>

【问题讨论】:

    标签: asp.net asp.net-3.5 postback validation


    【解决方案1】:

    您可以通过添加EnableClientScript="true" 属性将验证移至客户端。不会发生回发,因为将使用 JS 执行检查。

    除此之外,您可以在对TextChanged事件执行回调函数时检查页面是否有效,以定义函数是否可以继续。您应该将ValidationGroup 属性添加到您的验证器,并在检查Page.IsValid 之前调用指定该组的Page.Validate 函数。

    更新

    这里是提示。

    添加你自己的JS函数,例如:

    function IsValid( args ) {
            if( args.value.length == 0 ) {
                return false;
            }
            else {
                return true;
            }
        }
    

    Page_Load 事件中添加此代码:

    txtQuantity.Attributes[ "onchange" ] = "if ( IsValid(this) == false ) return;";
    

    当输入正确时,这不会弄乱自动回发,但会阻止回发。

    【讨论】:

    • 你是对的,我试过了。问题是我有一个 RangeValidator 需要 Min 和 Max 值,我在将这两个值发送到 IsValid 函数时遇到问题。但你的想法有效。出于这个原因,尽管问题没有解决,但我会接受你的回答..
    • 您仍然可以备份客户端场景。为此,在服务器端添加页面级变量,然后在服务器标记中添加类似: var MinValueStr = "";并在使用前将其转换为整数。
    • 这行不通,因为文本框位于列表控件中,我需要列表中每行的特定最小值和最大值,但我想我克服了它。完成后我会分享。
    • 如果有人在浏览器中禁用 JavaScript 怎么办?
    【解决方案2】:

    为文本框添加CausesValidation="true",它会很好。如果验证无效,则不会有任何回发。

    <asp:TextBox ID="txtQuantity" runat="server" AutoPostBack="true" ontextchanged="txtQuantity_TextChanged" CausesValidation="true"></asp:TextBox>
    

    【讨论】:

    • 是的,但这避免了回发,我希望 AutoPostback = "true" 这样它就可以验证文本框中的数据以用于程序中的其他逻辑。
    • 谢谢纳文。它做它应该做的事情。太棒了!
    【解决方案3】:

    仅分享已接受答案的内联较短版本:

    <asp:TextBox ID="txtQuantity" runat="server"
        AutoPostBack="true" ontextchanged="txtQuantity_TextChanged"
        onchange="if (this.value.length == 0) return;"></asp:TextBox>
    

    RequiredFieldValidator 也有同样的问题,上面的方法对我有用。

    已知的唠叨:设计师抱怨“onchange”不是一个有效的服务器端属性。

    【讨论】:

      【解决方案4】:

      将 AutoPostBack="true" 更改为 AutoPostBack="false" 后尝试。

      【讨论】:

      • 那么我的 TextChanged 事件将如何回发? :s
      • 为什么要回发 textchanged 事件。是否附带业务逻辑?
      【解决方案5】:

      我所做的是在我的客户端验证功能中测试我所在的事件类型。如果事件显示我在更改事件中,我声明验证通过并离开。

      		if (event.type === 'change') {
      			args.IsValid.true;
            return;
      		}

      我相信这是最好的解决方案,因为您可以让验证器连线并根据需要设置文本框,而不必再担心导致验证的更改事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多