【发布时间】:2011-06-28 18:17:25
【问题描述】:
好吧,我快要疯了,因为疯狂的颠倒定义是做同样的事情并得到不同的结果。
对于给定的 ASPX:
<asp:DropDownList ID="ddl1" runat="server" DataSource="<%# DataContext.Items1 %>"
DataValueField="Id" DataTextField="Text" AppendDataBoundItems="false"></asp:DropDownList>
<br/>
<asp:DropDownList ID="ddl2" runat="server" DataSource="<%# DataContext.Items2 %>"
DataValueField="Key" DataTextField="Value" AppendDataBoundItems="false"></asp:DropDownList>
您会认为两个 DropDownList 的行为相似 - 也就是说,在回发时,两者都会经历相同的确切生命周期并正常工作。毕竟,唯一的区别是它们使用不同的数据源(都是 IEnumerable
所以我希望在回发(通过表单提交)时,在 Page.LoadComplete 执行时,两个 DDL 都应该已经加载 1)通过 DataSource 加载它们的项目和 2)从回发加载它们的状态(SelectedIndex)数据。
不幸的是,事实并非如此。我看到的是 ddl1 将执行 LoadViewState(加载项目)然后 LoadPostData(设置 SelectedIndex),但 ddl2 不执行 LoadViewState - 只有 LoadPostData。此时 ddl2 现在是不正确的,因为如果它没有 Items 那么它会忽略来自 LoadPostData 的值。
所以我大吃一惊。我已经清理了解决方案并多次重新启动 VS2010,我已将 EnableViewState="true" 添加到 ddl2,但不一致的行为仍然存在。
有人可以在这里解释一下为什么 DropDownLists 的行为不同,尽管配置几乎相同?
澄清
我的页面比 2 个 DropDownLists 复杂得多,为了清楚起见,我在示例中只指定了 2 个。实际上有 42 个 DDL、7 个复选框、5 个文本框和 2 个列表框
更新
我试过了
A) 交换数据源/字段 - 没有差异
B) 使用相同的数据源/字段 - 没有差异
C) 删除 ddl1 - ddl2 再次开始工作!
D) 添加了 ddl3(ddl1 的副本) - ddl2 或 ddl3 都不起作用
所以我认为我在这里遇到了某种 ViewState 大小限制 - 我将重新编码我的一些 DropDownList,以便它们不会将项目存储在 ViewState 中,而是先从 DataSource 重新加载它加载PostData。
【问题讨论】:
-
您是否确保两个数据集在回发期间都有您期望的数据?
-
@Brian Dishaw 两个数据集都存在 - 但在 Page.PreRender/Databind 之前都没有被引用。 DropDownList 以某种方式将其项目存储在 ViewState 中,该 ViewState 在 Page.Load 之前加载
标签: asp.net drop-down-menu postback