我有以下非常简单的代码
<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>
和背后的代码
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); }
我的问题在于,文字控件只能添加一次。我曾搜索过Google和博客网站(以及书籍),但没有任何运气。我想念什么?
在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); } }