Panel控件的RenderControl方法问题,百思不得其解,高手们救命啊
下面的代码用于实现读取Panel3控件的HTML内容,出现一个问题是Panel控件中如果放置可用于用户输入服务器控件例如文本框 RenderControl 方法调用就出现问题了,恳求高手们帮忙解决,用其他方法能实现的也可以,分不够再加,谢谢了
=================== 问题描述如下 ========================================
类型“TextBox”的控件“TextBox1”必须放在具有 runat=server 的窗体标记内。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Web.HttpException: 类型“TextBox”的控件“TextBox1”必须放在具有 runat=server 的窗体标记内。
源错误:
行 6: System.Web.UI.HtmlTextWriter htw = new HtmlTextWriter( sw );
行 7:
行 8: this.Panel3.RenderControl(htw);//这行代码出现问题
行 9: this.Response.Write( "a: "+sw.ToString());
行 10:
源文件: D:\web\ThinkseaWebsite\a\b.aspx 行: 8
堆栈跟踪:
[HttpException (0x80004005): 类型“TextBox”的控件“TextBox1”必须放在具有 runat=server 的窗体标记内。]
System.Web.UI.Page.VerifyRenderingInServerForm(Control control) +152
System.Web.UI.WebControls.TextBox.AddAttributesToRender(HtmlTextWriter writer) +40
System.Web.UI.WebControls.WebControl.RenderBeginTag(HtmlTextWriter writer) +17
System.Web.UI.WebControls.TextBox.Render(HtmlTextWriter writer) +17
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) +7
System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +29
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
ASP.b_aspx.Button1_Click(Object sender, EventArgs e) in D:\web\ThinkseaWebsite\a\b.aspx:8
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain() +1277
=================== 源码如下 ============================================
<%@ Page language= "c# " %>
<script runat=server>
private void Button1_Click(object sender, System.EventArgs e)
{
System.IO.StringWriter sw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htw = new HtmlTextWriter( sw );
this.Panel3.RenderControl(htw);//这行代码出现问题
this.Response.Write( "a: "+sw.ToString());
htw.Close();
sw.Close();
}
</script>
<HTML>
<body>
<form id= "Form1 " method= "post " runat= "server ">
<asp:Panel id= "Panel3 " runat= "server "> Panel
<asp:TextBox id= "TextBox1 " runat= "server "> </asp:TextBox> </asp:Panel>
<asp:Button id= "Button1 " runat= "server " Text= "Button " OnClick= "Button1_Click "> </asp:Button>
</form>
</body>
</HTML>
[解决办法]
HTML控件不会出错,服务器控件就会出错
panel1.RenderControl(HtmlTextWriter )方法好象转服务器控件会出问题
[解决办法]
参考下面的文章的解释说明
http://blog.csdn.net/net_lover/archive/2006/09/25/1282106.aspx
[解决办法]
加
public override void VerifyRenderingInServerForm(Control control)
{
}
即可,但有些数据服务器会得不到了
[解决办法]
可以用其他方法代替!
[解决办法]
Button必须在HtmlForm(即 <form runat= "server " /> )内,否则就会抛出异常。你可以继承自Button并且override掉VerifyRenderingInServerForm方法,不要调用base以避开这个检查,但是这个Button无法用于提交数据。
[解决办法]
看看楼主给出的代码,会发现根本没有把Panel放在Form以外,所以那种认为放在外面才会引起此异常、才会丢失控件状态的说法是错误的。
在asp.net的客户端回调模式中特意进行了判断使得这个异常,这足以说明asp.net项目组也注意到了即使控件放在Form中也有需要取消这个异常的可能性。换句话说asp.net项目组注意到了当初设计上存在考虑不周的地方,但是为了兼容不得不用堆砌的办法来处理。
在asp.net2.0中,asp.net以为程序员根本不会在页面RenderControl之前需要对子控件RenderControl,因此它设计了一个逻辑:当页面没有执行到Render阶段的时候对控件执行Render就报错。实际上,它根本不去判断控件是否真的在Form内。
这个错误应该是“类型“TextBox”的控件“TextBox1”必须在具有 runat=server 的窗体输出过程之内输出。”,意即Render操作被提前了。
不知道,怎么被误翻译为必须那样的意思了。
[解决办法]
注意,asp.net的设计逻辑并没有真的判断控件是否在Form内,我估计是异常处理信息的本地化翻译出了问题,就好像有人把面包翻译为屁股。
[解决办法]
你把这个问题看清楚是asp.net在检查是否在Form的Render之前就执行其它控件的Render,就能清晰地看出你必须重载。
[解决办法]
哦,我重新看了一下,我前边有一句话大字太快有点错误,可能造成楼主误解我的意思:
在asp.net的客户端回调模式中特意进行了判断使得这个异常 -->
在asp.net的客户端回调模式中特意进行了判断使得不出现这个异常
实际上,当在客户端回调模式中的时候,asp.net对所有控件的判断都是在VerifyRenderingInServerForm中直接返回,跟你这里重载这个方法来禁止它实际被检验的意思是一样的,
[解决办法]
一定要放在form里面这样就不会抱错。而且form里面要有runat=server
[解决办法]
唉,我贴过来楼主的代码:
<form id= "Form1 " method= "post " runat= "server ">
<asp:Panel id= "Panel3 " runat= "server "> Panel
<asp:TextBox id= "TextBox1 " runat= "server "> </asp:TextBox> </asp:Panel>
<asp:Button id= "Button1 " runat= "server " Text= "Button " OnClick= "Button1_Click "> </asp:Button>
</form>
难道说Panel3写错了位置了吗?
[解决办法]
up
[解决办法]
收藏
[解决办法]
用reflector看了一下,发现 sp1234(战斗即将展开,所有控件已经启用缓存) 说的是正确的。VerifyRenderingInServerForm在非Callback时,会检查现在是否是HtmlForm开始Render之后和结束Render之前,因为你没有启动HtmlForm的Render,这个检查就通不过。
不过我不明白你为什么要如此去Render一个独立的控件,是你自己的AJAX实现所需?