Asp.net webforms - 将忽略CausesValidation = true

时间:2014-02-27 10:21:55

标签: asp.net .net

我遇到了我们所拥有的网页的问题,并缩小了样本:

ASPX:

     <div>
        <asp:DropDownList ID="ddlSomething" runat="server" 
                     CausesValidation="true" AutoPostBack="true">
            <asp:ListItem>One</asp:ListItem>
            <asp:ListItem>Two</asp:ListItem>
        </asp:DropDownList>
        <asp:Button ID="btnFilter" runat="server" Text="Filter" />
    </div>

代码:

Partial Class ValTest
    Inherits System.Web.UI.Page

    Protected Sub btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click

        BindGrid()

    End Sub

    Protected Sub ddlSomething_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlSomething.SelectedIndexChanged

        BindGrid()

    End Sub

    Private Sub BindGrid()

        If (Page.IsValid) Then

            'Do something that takes a little time here
            System.Threading.Thread.Sleep(2000)

            Response.Write("Done")

        End If

    End Sub

End Class

请注意,下拉列表的autopostback设置为true,并将causevalid设置为true。

现在,如果我更改下拉列表并让页面加载,它可以正常工作。同样,如果我只是单击按钮,那么它可以正常工作。但是,如果我更改下拉列表然后,在页面完全重新加载之前,单击按钮,然后我收到此错误:

在进行验证之前无法调用Page.IsValid。应该在事件处理程序中查询具有CausesValidation = True并启动回发的控件,或者在调用Page.Validate之后查询。

现在,我可以通过在Page.Validate()的支票前加Page.IsValid来解决这个问题,不过我很好奇是否有人可以解释为什么会发生这种情况。我期待发送两个回发,每个都会导致验证,每个都应该有效...


ASP.net 4.5,以防它有所作为。

0 个答案:

没有答案