将控件动态添加到ASP.NET AJAX中的UpdatePanel

Chr*_*s S 13 asp.net ajax updatepanel

我有以下非常简单的代码

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <asp:PlaceHolder ID="PlaceHolder1" runat="server">
    </asp:PlaceHolder>
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)

而代码隐藏

protected void Button1_Click(object sender, EventArgs e)
{
    Literal literal = new Literal();
    literal.Text = DateTime.Now.ToString();
    literal.ID = DateTime.Now.Ticks.ToString();

    // These both work fine the first time the button is clicked
    // but the second time nothing is added.
    UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
    PlaceHolder1.Controls.Add(literal);
}
Run Code Online (Sandbox Code Playgroud)

我的问题在于Literal控件只添加一次.我已经搜索了谷歌和博客网站(加上书籍),但没有任何运气.我错过了什么?

d4n*_*4nt 23

在asp.net中,ASPX文件中的控件会在每次回发时自动生成.您创建的控件不在ASPX代码中,因此框架不会为您创建它们.第一次执行Button1_Click方法时,会向页面添加一个额外的控件.第二次执行Button1_Click方法时,你正在回复另一个帖子,并且忘记了第一个额外的按钮.所以回发的结果是你再次获得一个额外的按钮.

每次单击按钮时,这将创建一个额外的控件(尽管每次按下按钮时都会更新时间戳,因为正在重新创建控件)

protected void Button1_Click(object sender, EventArgs e)
{
    int count = 0;

    if (ViewState["ButtonCount"] != null)
    {
        count = (int)ViewState["ButtonCount"];
    }

    count++;
    ViewState["ButtonCount"] = count;

    for (int i = 0; i < count; i++)
    {
        Literal literal = new Literal();
        literal.Text = DateTime.Now.ToString();
        literal.ID = DateTime.Now.Ticks.ToString();

        UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
        PlaceHolder1.Controls.Add(literal);
    }            
}
Run Code Online (Sandbox Code Playgroud)