【问题标题】:Items in a Repeater are lost during a postback (callback)转发器中的项目在回发(回调)期间丢失
【发布时间】:2012-03-13 21:30:04
【问题描述】:

使用 ASP.NET 4.0 WebForms。 我有一个带有复选框的中继器。中继器和复选框启用了视图状态。有一个按钮会导致回调回发。这些元素驻留在回调面板中(类似于 MS 的 UpdatePanel,但不使用视图状态)。中继器在初始加载期间绑定到数据表,中继器显示复选框。到目前为止还不错。

在回发(回调)期间,我注意到 page_load 中转发器的项目计数为 0。因此我无法获得任何复选框值。我可以在 Request.Form 集合中看到复选框的键/选中值条目。

我认为我遗漏了一些明显的东西,但是我可以在生命周期中的哪个位置读取中继器的项目? 还是我应该从 Request.Form 中获取它们?

【问题讨论】:

  • 您想在哪里阅读它们?给我们看一些代码。
  • 我想在 page_load 或更高版本中阅读它们。

标签: asp.net


【解决方案1】:

1) 尝试连接到 LoadComplete。所有子控件都以递归方式加载,因此有时在 Load 事件期间并非您期望的所有内容都会出现。

2) 确保在 Init 事件期间或之前初始化中继器。如果你有一些代码运行来填充它,那么这必须在 Init 中执行。在页面的生命周期中,ASP.NET 尝试获取发布的值并将它们应用于控件。如果在生命周期中没有足够快地创建控件,那么它们将不会在该步骤中存在以接受发布的值。这是 ASP.NET 中动态页面最令人沮丧的事情之一,因为您必须确保在 init 的回发期间重建页面。因此,即使您在帖子中看到数据,如果在其控件集合中找不到控件,ASP.NET 也会忽略它。此外,控件 ID 会发生一些神奇的事情,用于将发布的值映射到控件中。不过我不记得那件事的细节了,因为我不得不深入研究哈利的细节已经好几个星期了。

另外,请确保您没有使用 if(!IsPostBack) 来初始化中继器或其他控件/数据。即使是回发,您仍然需要存在控件,以便它们可以接受发布的值。

虽然我没有使用回调面板,所以我不确定这会如何搅浑水。

【讨论】:

    【解决方案2】:

    我通过覆盖包含转发器的控件上的DataBind 方法解决了我的问题。这可以防止父控件上的DataBinds 在转发器上向下滴流并将数据绑定到转发器还没准备好。我的问题是父控件/页面执行了一个 DataBind,它向下渗透到子控件,包括 repepater,导致它被清除。 因此,您不必像@AaronLS 建议的那样在每次回发时直接在转发器上执行DataBind

    另外,请确保您没有使用 if(!IsPostBack) 初始化您的中继器或其他控件/数据。即使它是一个 回发,您仍然需要控件存在,以便他们可以接受 发布的值。

    即使我只绑定了一次数据,我所有的 RepeaterItems 都通过回发保持存在。

    在我的例子中,每次回发都在转发器上执行DataBind 会导致表单值被重置。

    【讨论】:

    • 与其重写控件上的 DataBind,为什么不直接避免 Page.DataBind(如果可能的话)? +1 帮助我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2011-05-29
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多