0

这是一个很难解释的场景,所以我编写了一个简单的例子。

<asp:UpdatePanel runat="server" ID="upTest" ChildrenAsTriggers="true"
UpdateMode="Conditional">
  <ContentTemplate>
     <asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="true"></asp:DropDownList>
     <br /><br /> 
     In page: <asp:TextBox runat="server" ID="txtTest" Columns="50" Text="OnLoad</asp:TextBox>
     <br />
     <br />
     <asp:Button runat="server" ID="btnTest" Text="Click it" />
  </ContentTemplate>
  <Triggers>
     <asp:AsyncPostBackTrigger ControlID="ddlTest" />
  </Triggers>
 </UpdatePanel>

代码隐藏

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack Then
        BindDropDown(Request.Form(ddlTest.UniqueID))
    Else
        BindDropDown(0)
    End If
End Sub

Public Sub BindDropDown(val As Integer)

    ddlTest.Items.Add(New ListItem("", 0))
    ddlTest.Items.Add(New ListItem("One", 1))
    ddlTest.Items.Add(New ListItem("Two", 2))
    ddlTest.Items.Add(New ListItem("Three", 3))
    ddlTest.Items.Add(New ListItem("Four", 4))
    ddlTest.SelectedValue = val

End Sub

Private Sub ddlTest_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlTest.SelectedIndexChanged
    txtTest.Text = "Dropdown changed"
End Sub

Private Sub btnTest_Click(sender As Object, e As System.EventArgs) Handles btnTest.Click
    txtTest.Text = "Button clicked"
End Sub

另请注意,我为页面设置了 EnableViewState="false" 和 ClientIdMode="Static"。

当我单击按钮时,会发生部分回发,并且文本框的预期值为 'Button Clicked'

当我更改下拉菜单时,会发生部分回发,但是文本框没有“已更改下拉菜单”的预期值,因为 ddlTest_SelectedIndexChanged 中的代码永远不会被命中(该代码行上的断点位置也永远不会命中)

在我项目的更大范围内,这是问题的症结所在,我无法确定为什么这个事件永远不会被命中(核心问题是当我加载动态用户控件时,控件中的数据被正确绑定,但随后在加载用户控件后被 pre-post 数据覆盖 - 覆盖发生在 post back 事件的某处)。在我看来,这与下拉列表的绑定以及它在页面周期中发生的位置有关,但我无法确定任何内容,也无法提出谷歌解决方案。

在查看 Firebug 中的帖子时,我确实注意到了一件奇怪的事情——下拉列表的 EVENTTARGET 值是下拉列表的 UniqueId,但按钮单击的 EVENTTARGET 值为空。我的大脑在想这里有一些联系。

仅供参考 - 我想出了一个似乎可以解决问题的解决方法。我将下拉菜单上的自动回发设置为 false,并使用 jQuery 在下拉菜单上分配更改事件以触发按钮单击 - 这会导致回发并在代码中触发 btn_click 事件。

4

1 回答 1

0

我通过将下拉填充移动到 init 事件然后让 .NET 从视图状态加载所选值来解决了这里的初始问题

但是在这样做时,现在 selectedindex 事件会在每次回发时触发。

于 2012-07-17T14:01:08.617 回答