首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

Panel控件的RenderControl方法有关问题,百思不得其解,高手们

2012-01-02 
Panel控件的RenderControl方法问题,百思不得其解,高手们救命啊下面的代码用于实现读取Panel3控件的HTML内

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实现所需?

热点排行