2012-03-13 78 views
3

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

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

我觉得我缺少在生命周期的东西很明显,但在那里我可以阅读直放站的项目? 或者我应该从Request.Form获取它们吗?

+0

你想在哪里阅读它们?向我们展示一些代码。 – 2012-03-13 21:52:00

+0

我想在page_load或更高版本中阅读它们。 – 2012-03-13 22:08:51

回答

3

1)尝试接线到LoadComplete。所有子控件都是递归加载的,所以有时在Load事件期间,您所期望的所有内容都不会存在。

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

此外,还要确保你没有做这样的事情,如果使用(!的IsPostBack)来初始化中继器或其它控制/数据。即使它是回发,仍然需要存在控件才能接受发布的值。

我没有用一个callbackpanel虽然,所以我不确定这将如何把水搅浑。

1

我通过覆盖在包含中继控制的DataBind方法解决我的问题。阻止父控件上的DataBind在未准备好的情况下将数据递减并绑定到中继器。我的问题是一个父控件/页面执行了一个DataBind,它传递给子控件,包括重排,导致它被清除。 所以你不必直接做DataBind中继器上像@AaronLS每次回传提示:

此外,还要确保你没有做这样的事情,如果使用到 初始化(的IsPostBack!)您的中继器或其他控件/数据。即使这是 回发,您仍然需要控件存在,以便他们可以接受 发布的值。

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

在我的情况下,中继器上的每一个回发执行DataBind引起形式值复位。

+0

而不是重写控件上的DataBind,为什么不避免Page.DataBind(如果可能的话)? +1帮助我! – Nurp 2014-03-18 13:29:01