AutoPostBack="true" 也触发不了?

作者:vkvi 来源:ITPOW(原创) 日期:2007-10-24

DropDownList 和 ListBox 的 OnSelectedIndexChanged 默认是不会立即触发的,除非 AutoPostBack 为 true。

但有时 AutoPostBack="true",在更改了选择项后,似乎仍然没有变化,到底是谁之过呢?

其实,我们只要分析一下原理,就很容易找出问题所在了。

  • DropDownList 和 ListBox 在客户端的表现均为 select,只是 size 和 multiple 属性值不同罢了。
  • AutoPostBack 为 true 后,更改了选择项后,选中的项的 value 会被传给服务器端,也就是说 AutoPostBack 生效了。
  • 服务器端将客户端刚刚传来的 value 与前一次的选中项的 value 进行比较。
  • 如果比较结果是相同,则认为没有更改选中项,OnSelectedIndexChanged 不被触发。

也就是说如果有两个选项的 value 是相同的,则在这两个选项之间切换时,不会触发 OnSelectedIndexChanged 。由此可见比较的是选中项的 value,并不是 index,所以我觉得 OnSelectedIndexChanged 应该改名为 OnSelectedValueChanged 更合理一些。

验证一下:

    <asp:ListBox ID="ddl" runat="server" AutoPostBack="true" OnSelectedIndexChanged="OnChng" SelectionMode="multiple">
      <asp:ListItem Text="1" Value="0"></asp:ListItem>
      <asp:ListItem Text="2" Value="0"></asp:ListItem>
      <asp:ListItem Text="3" Value="1"></asp:ListItem>
    </asp:ListBox>

由于第一项和第二项的 value 一样,所以即使选中了第二项,经过服务器端处理后,也会变成选中的是第一项。

那为什么客户端不传送选中项的 index 过来呢?这与 HTML 有关,HTML 中只传送 select 的选中项的 value,并不传送 index,虽然可以利用 JavaScript 实现 index 传送,但为了兼容面更广,所以并没有使用这种方法。并且 value 才是意义所在,绝大多数情况下,并不需要 value 相同的情况。

相关文章