当网页被回传时,如果改变了PlaceHolder的控件,ASP.NET就会试图用返回的状态值去填充新的控件, 这时就会产生错误(填充原来的空间的话正好可以满足状态在客户端和服务器之间传递)。 解决办法:多用几个PlaceHoder分别装不同的控件 <asp:PlaceHolder EnableViewState="False" ID="PlaceHolder1" runat="server"> 这里放引起错误的控件 </asp:PlaceHolder> 附: 定义和用法 PlaceHolder 控件用于为代码添加的控件预留空间。在页控件层次结构中为以编程方式添加的控件保留位置。 注释:PlaceHolder 不会产生任何可见的输出(仅仅是网页上其它控件的容器)。 属性 属性 描述 .NET runat 规定控件是服务器。必须设置为 "server"。 1.0 Web 控件标准属性 AccessKey, Attributes, BackColor, BorderColor, BorderStyle, BorderWidth, CssClass, Enabled, Font, EnableTheming, ForeColor, Height, IsEnabled, SkinID, Style, TabIndex, ToolTip, Width控件标准属性 AppRelativeTemplateSourceDirectory, BindingContainer, ClientID, Controls, EnableTheming, EnableViewState, ID, NamingContainer, Page, Parent, Site, TemplateControl, TemplateSourceDirectory, UniqueID, Visible语法: <asp:PlaceHolder EnableTheming="True|False" EnableViewState="True|False" ID="string" OnDataBinding="DataBinding event handler" OnDisposed="Disposed event handler" OnInit="Init event handler" OnLoad="Load event handler" OnPreRender="PreRender event handler" OnUnload="Unload event handler" runat="server" SkinID="string" Visible="True|False" /> 备注:将 PlaceHolder 控件用作容器,从而将动态添加的服务器控件存储到网页中。PlaceHolder 控件不产生任何可见的输出,仅用作网页上其他控件的容器。您可以使用 Control.Controls 集合在 PlaceHolder 控件中添加、插入或移除控件。 实例: 下面的示例演示如何将 Web 服务器控件添加到 PlaceHolder 控件中。 Visual Basic <%@ Page Language="VB" AutoEventWireup="True" %> <html> <head> <mce:script runat="server"><!-- Sub Page_Load(Sender As Object, e As EventArgs) Dim myButton As HtmlButton = New HtmlButton() myButton.InnerText = "Button 1" PlaceHolder1.Controls.Add(myButton) myButton = New HtmlButton() myButton.InnerText = "Button 2" PlaceHolder1.Controls.Add(myButton) myButton = New HtmlButton() myButton.InnerText = "Button 3" PlaceHolder1.Controls.Add(myButton) myButton = New HtmlButton() myButton.InnerText = "Button 4" PlaceHolder1.Controls.Add(myButton) End Sub // --></mce:script> </head> <body> <form runat="server"> <h3>PlaceHolder Example</h3> <asp:PlaceHolder id="PlaceHolder1" runat="server"/> </form> </body> </html> C# <%@ Page Language="C#" AutoEventWireup="True" %> <html> <head> <mce:script runat="server"><!-- void Page_Load(Object sender, EventArgs e) { HtmlButton myButton = new HtmlButton(); myButton.InnerText = "Button 1"; PlaceHolder1.Controls.Add(myButton); myButton = new HtmlButton(); myButton.InnerText = "Button 2"; PlaceHolder1.Controls.Add(myButton); myButton = new HtmlButton(); myButton.InnerText = "Button 3"; PlaceHolder1.Controls.Add(myButton); myButton = new HtmlButton(); myButton.InnerText = "Button 4"; PlaceHolder1.Controls.Add(myButton); } // --></mce:script> </head> <body> <form runat="server"> <h3>PlaceHolder Example</h3> <asp:PlaceHolder id="PlaceHolder1" runat="server"/> </form> </body> </html>