中继器中的项目在回发期间丢失(回调)

时间:2012-03-13 21:30:05

标签: asp.net

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

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

我认为我遗漏了一些明显的东西,但在生命周期中哪些地方可以阅读转发器的项目? 或者我应该从Request.Form中获取它们吗?

2 个答案:

答案 0 :(得分:3)

1)尝试连接到LoadComplete。所有子控件都是递归加载的,因此有时候在Load事件期间不会出现您希望存在的所有内容。

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

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

我没有使用过回调面板,所以我不确定这会如何使水变得混乱。

答案 1 :(得分:1)

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

  

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

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

就我而言,每次回发在转发器上执行DataBind都会导致重置表单值。