回复:ASP.NET 2.0服务器控件与form runat=server标记
这是因为,TextBox控件在进行Render的时候调用了page1.VerifyRenderingInServerForm(this);,因此,如果不放在<form runat=server></form>的标记之间,这个验证过程是通不过的。
但是,我们可以在代码中重载这个方法,以便是TextBox控件可以放在<form runat=server></form>的标记之外,例如下面的代码:

Code
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
<script runat="server">
public override void VerifyRenderingInServerForm(Control control)
{
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml";>
<head runat="server">
<title>VerifyRenderingInServerForm</title>
</head>
<body>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<form id="form1" runat="server">
</form>
</body>
</html>
浏览这样的页面就不会产生异常。
3,调整展现方式后,页面能否正常工作
MSDN上解释Page.VerifyRenderingInServerForm 方法时说:
如果回发或使用客户端脚本的服务器控件没有包含在 HtmlForm 服务器控件 (<form runat="server">) 标记中,它们将无法正常工作。这些控件可以在呈现时调用该方法,以在它们没有包含在 HtmlForm 控件中时提供明确的错误信息。
是的,虽然下面的代码可以正常显示,但一旦单击“提交”按钮,服务器端将得不到输入的值,页不能保存状态了。