为什么验证失败会阻止其他验证组中的控制回发?

SPK*_*der 1 asp.net validation postback webforms

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

验证在AJAX UpdatePanel中进行.我不确定这是否重要.

May*_*yit 9

我很高兴解决方法对您来说没问题,但是为了让其他人登陆此页面,禁用客户端验证远非可接受的解决方案.所以这里:

为什么它只在UpdatePanel周围发生时,我仍然不清楚,但是:

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

另请参阅:为什么我的表单在验证后不会发回?

有一个变量被调用Page_BlockSubmit,当客户端验证失败时,该变量设置为true:

function Page_ClientValidate(validationGroup) {
    ....
    Page_BlockSubmit = !Page_IsValid;
    return Page_IsValid;
}
Run Code Online (Sandbox Code Playgroud)

因此,当__doPostBack发生是由于,比方说,一个部分OnSelectedIndexChangedDropDownList,有这样的检查:

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

哪个会第一次阻止,但随后清除该标志,因此下一次回发尝试应该有效.

解决办法,在我的情况下,为DropDownListOnSelectedIndexChanged事件,是有添加到其客户端的一个片段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>
Run Code Online (Sandbox Code Playgroud)

你可能会把这个片段放到onchange自己身上.