1

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

验证发生在 AJAX UpdatePanel 中。我不确定这是否重要。

4

3 回答 3

10

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

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

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

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

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

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

因此,当 a__doPostBack作为 a 的一部分出现时,会进行OnSelectedIndexChanged以下DropDownList检查:

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

这将第一次阻止,但随后清除标志,因此下一次回发尝试应该有效。

就我而言,对于 aDropDownListOnSelectedIndexChanged事件,解决方法是在其客户端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>

您可能会逃脱将该片段放入onchange自身中。

于 2014-06-28T00:18:08.010 回答
3

除了单击此按钮后,除非已更正验证错误,否则没有其他按钮可以导致回发。因此,不需要验证文本框的 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"  />
于 2012-07-13T17:23:46.127 回答
0

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

于 2012-07-13T18:00:32.127 回答