【问题标题】:A tale of two DropDownLists (that behave differently despite being configured identically)两个 DropDownLists 的故事(尽管配置相同,但行为不同)
【发布时间】: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)并访问 Text/Value 字段的不同属性。

所以我希望在回发(通过表单提交)时,在 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


【解决方案1】:

最简单的解释往往最有可能是正确的。所以如果除了数据源外一切都一样,那么问题就出在数据源上。或者,它与一个一起工作,所以问题是有两个。你试过了吗:

  1. 使用相同的数据源加载两个下拉列表(好的和坏的?)
  2. 在指向错误数据源的页面上加载单个下拉列表?

希望这会有所帮助。

【讨论】:

  • 我同意:尝试一次隔离一个变量并找出导致中断的“移动部分”。
  • 我做了以下事情:A)交换数据源和 B)使两个数据源相同(Items1)。在这两种情况下,ddl2 都无法加载。陌生人和陌生人。
  • ddl2 也有不同的 DataValueField 和 DataTextField 值。对不起,我没有详细说明。我假设当您“交换数据源”时,您还交换了 DataValueField 和 DataTextField 值?
  • @theoretical 是的,我也交换了这些值
  • 如果 ddl1 不在页面上,ddl2 是否工作(指向任一数据源)?
【解决方案2】:

类似于@theoretical 的回答,另一件事要检查/尝试:

确保将“Key”和“Value”定义为 DataContext.Items2 上的属性。确保它们不是公共数据字段,而实际上是属性;一些 .NET 控件(我认为是中继器)在进行反射时看起来明确且仅用于属性。

可能会暂时将 ddl2 的 DataValueField 和 DataTextField 设置切换为与 ddl1 相同,以帮助缩小可能出现的问题。

你让我很好奇这个问题的根本原因 - 祝你好运!

【讨论】:

    【解决方案3】:

    我不确定问题出在哪里,但我的猜测是我有 1 个太多的表单字段,这导致 ddl2 无法正确存储在 ViewState 中。

    所以我创建了一个 LightDropDownList,它继承了 DropDownList 并将其用于 ddl2。 LightDropDownList 禁用 ViewState,并在 OnInit 期间调用 DataBind()。正常 DDL 的工作方式是从 ViewState 加载项目,在 LoadPostData 上设置选定项目,然后在页面数据绑定时覆盖项目。所以我可以通过手动调用 DataBind 来消除将所有 Items 数据存储在 ViewState 中的需要。这样,当调用 LoadPostData 方法时,DDL 会加载其项目,因此正确设置了所选项目。

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 2023-03-06
      • 2019-03-05
      相关资源
      最近更新 更多