带动态控件的UpdatePanel不会回发

时间:2011-11-16 07:41:07

标签: asp.net

我正在使用UpdatePanel并动态加载内容:

 <asp:UpdatePanel runat="server" ID="updatePanel" UpdateMode="Conditional">
        <ContentTemplate>
            <div id="dashboard-main">
                <div id="dashboard-content">
                    <div class="d-content">
                        <asp:PlaceHolder runat="server" ID="ContentPanel">
                        </asp:PlaceHolder>
                    </div>
                </div>
                <div id="sub-content">
                    <ul id="nav-02">
                        <li class="current">
                            <asp:LinkButton CommandArgument="Stuff" OnClick="LoadMiniDash" runat="server" ID="myStuff">
                    My Stuff</asp:LinkButton></li>....

我所做的是按下LinkBut​​ton后,我将一个控件加载到ContentTemplate:

protected void LoadMiniDash(object sender, EventArgs e)
        {
            string miniDashName = ((LinkButton)sender).CommandArgument;

            Control control = Page.LoadControl("~/controls/Dashboard" + miniDashName + ".ascx");
            ContentPanel.Controls.Clear();
            ContentPanel.Controls.Add(control);
            updatePanel.Update();
        }

我的问题是,在这个新加载的控件中,还有另一个Button。单击后,updatepanel将被清空,并且不会回发到控件。 (但它确实对页面本身发送了一个async的帖子。但是我看到一旦点击控件就不会到达自己的代码了。)

可能是什么问题?

感谢

2 个答案:

答案 0 :(得分:1)

我只是想重写你的问题。加载userControl时,它将显示在updatePanel中。当您点击userControl中的按钮时,您的updatePanel会更新 - 您的userControl会“消失”。

Imo它消失了,因为你没有重新加载你的userControl。我尝试了以下代码段:

protected void btnLoadControl_Click(object sender, EventArgs e)
{
    /// save the name of the userControl to load in a SessionVar
    Session["userControl2Load"] = "ucDemo.ascx";
    Control control = LoadControl("ucDemo.ascx");
    phDemo.Controls.Clear();
    phDemo.Controls.Add(control);
    upDemo.Update();
}
/// reload your userControl on every init of the updatePanel
/// when the sessionVar is set
protected void upDemo_Init(object sender, EventArgs e)
{
    if (Session["userControl2Load"] != null)
    {
        string controlName = Session["userControl2Load"].ToString();
        Control control = LoadControl(controlName);
        phDemo.Controls.Clear();
        phDemo.Controls.Add(control);
    }
    Debug.WriteLine("upDemo Init");
}
它对我有用。如果它也适合你,请告诉我。 HTH

答案 1 :(得分:0)

我遇到过类似的问题..你知道解决这个问题很简单..

逻辑是..如果您在同一页面中有一个或多个更新面板,则所有更新面板的属性应相同,例如

Update Mode : Always
EnableViewState : true(if you are using it)

例如,您在同一个asp.net ajax页面中有3个更新面板,其中包含以下ID

UpdatePanel1
UpdatePanel2
UpdatePanel3

在更新面板1(UpdatePanel1)中,您有一个按钮,该按钮用于指定gridview中的记录。在更新面板1中单击按钮时,UpdatePanel2中的FormView应显示相应的值。

要实现此目的,您需要将(UpdatePanel1,UpdatePanel2)的特定更新面板属性设为

ChildrenAsTrigger : True
EnableViewState : true
RenderMode : Block/Inline
UpdateMode : Always
Visible : true

在UpdatePanel3中执行上述活动值已更改,或者您可以说它不依赖于UpdatePanel1或UpdatePanel2

如果您发现它有用,请将其标记为您的答案,否则请告诉我......