为什么__doPostBack()没有触发绑定的加载事件?

时间:2011-08-31 15:59:32

标签: javascript asp.net vb.net updatepanel postback

情况就是这样:我的页面上有一个可变数量的动态创建的更新面板,所以我想我会编写一个方法来处理每个面板的所有加载。

我的Updatepanel创建看起来像这样:

 Dim newUpdp As New UpdatePanel
 newUpdatep.ChildrenAsTriggers = False
 newUpdatep.UpdateMode = UpdatePanelUpdateMode.Conditional
 newUpdatep.ID = Guid.NewGuid.ToString

 AddHandler newUpdatep.Load, AddressOf updatep_load_method
 updatep_Holder.ContentTemplateContainer.Controls.Add(newUpdp)
 updatep_Holder.Update()  

这将创建更新面板并将其load事件绑定到方法“updatep_load_method”。只要将Updatepanel插入到持有者中,就会调用此方法。方法代码如下:

Private Sub updp_load_method(sender As UpdatePanel, e As System.EventArgs)
   Dim div As New HtmlGenericControl("div")
   div.InnerText = Date.Time.Now.ToString
   sender.ContentTemplateContainer.Controls.Add(div)
   sender.Update()
End Sub

稍后我想更新面板,并刷新时间。所以我使用了javascript __doPostBack方法。根据{{​​3}},__ doPostBack方法遵循整页回发生命周期,因此我认为我的Update面板的load事件将被触发,并且该特定更新面板将调用“updatep_load_method”...

虽然发生了部分回发,并且调用了其他更新面板的加载事件,但我的绑定事件却没有。那么这里发生了什么?

2 个答案:

答案 0 :(得分:0)

尝试在代码中实现RaisePostBackEvent方法:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
    //call the RaisePostBack event 
    base.RaisePostBackEvent(source, eventArgument);

   //add whatever code you need to execute on postback here
}

答案 1 :(得分:0)

您需要在Page_Init期间重新创建动态控件,并且必须使用相同的Id(因此在重新创建控件时无法执行Guid.NewGuid.ToString())。

否则,ASP.Net将无法找到您的控件并使用ViewState中的数据填充它。

这是一个很好的article,它解释了有关动态控件的更多信息。