【问题标题】:Why does a failed validation prevent postbacks from control in other validation groups?为什么验证失败会阻止回发在其他验证组中的控制?
【发布时间】:2012-07-13 13:55:44
【问题描述】:

我有一个带有多个文本框、按钮和其他控件的 asp.net 网络表单。其中一个按钮应该触发某些文本框中的内容验证。这工作正常,除了如果验证失败,则阻止页面的所有后续回发。修复无效值会消除错误消息,但仍不会发生回发。

验证发生在 AJAX 更新面板中。我不确定这是否重要。

【问题讨论】:

    标签: asp.net validation webforms postback


    【解决方案1】:

    我很高兴the workaround 适合您,但为了其他登陆此页面的人的利益,禁用客户端验证远非可接受的解决方案。所以这里是:

    为什么它只在UpdatePanel 出现时才发生,但我仍然不清楚:

    正如其他人所提到的,您遇到的问题很可能是因为不成功的验证尝试阻止了进一步的回发。

    另见:Why won't my form post back after validation?

    有一个名为Page_BlockSubmit的变量在客户端验证失败时设置为true:

    function Page_ClientValidate(validationGroup) {
        ....
        Page_BlockSubmit = !Page_IsValid;
        return Page_IsValid;
    }
    

    因此,当 __doPostBack 作为 OnSelectedIndexChanged 的一部分出现在 DropDownList 中时,就会进行以下检查:

    function ValidatorCommonOnSubmit() {
        ....
        var result = !Page_BlockSubmit; /* read the value */
        ....
        Page_BlockSubmit = false; /* reset it */
        return result; 
    }
    

    第一次会阻塞,然后清除标志,所以下一次回发尝试应该可以工作。

    就我而言,对于DropDownListOnSelectedIndexChanged 事件,解决方法是将sn-p 添加到其客户端onchange 事件中:

    <asp:DropDownList runat="server" ID="SomeDropDownList" OnSelectedIndexChanged="AlwaysDoSomething"
       onchange="resetValidationState(this);">
        ....
    </asp:DropDownList>
    <script type="text/javascript">
        function resetValidationState() {
            // clear any postback blocks, which occur after validation fails:
            window.Page_BlockSubmit = false;
        }
    </script>
    

    您可以将 sn-p 放入 onchange 本身。

    【讨论】:

    • 这正是我今天需要解决的问题,谢谢!
    【解决方案2】:

    除了在单击此按钮后,除非已更正验证错误,否则其他按钮不会导致回发。因此,不需要验证文本框的 btnDelete 在更正文本框值之前无法回发

    在下面的代码中看不到这种行为..

    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="RequiredFieldValidator" ControlToValidate="TextBox1" ValidationGroup="pc">
    </asp:RequiredFieldValidator>
    <asp:Button runat="server" ID="btnSubmit" Text="Submit"  Width="150" CausesValidation="true" ValidationGroup="pc" />
    <asp:Button runat="server" ID="btnDelete" Text="Delete" CausesValidation="false"  />
    

    【讨论】:

    • 抱歉,我最初的描述并不全面。我不想在后面发布我所有的标记或代码,因为它非常大。我已经根据我一直在做的更多故障排除更新了我的问题。感谢您的回复。
    • 即使使用 updatepanel 我也看不到这种行为..确保验证失败后页面上没有 JS 错误
    • 不;没有脚本错误。我猜页面上的其他东西一定是在弄乱验证/回发脚本?让我们看看我能不能弄清楚……
    • 肯定和UpdatePanel有关。我刚刚注释掉了 UpdatePanel,一切都按预期工作(除了完整回发而不是异步回发)。
    • 正是我需要的,非常感谢!
    【解决方案3】:

    我在这里可能完全不在话下 - 但我想我看到了问题。 (我主要使用 devexpress 控件,因此规则可能会有所不同)。当验证失败时,整个页面被设置为无效,因此不会发生回发。难道是因为删除按钮没有引起任何验证,在这些编辑器被更改为有效之后它没有重新验证?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多