我遇到了我们所拥有的网页的问题,并缩小了样本:
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,以防它有所作为。