- 文章转载至: http://www.olnote.com/itlife/note/100000003.aspx
- 控件包含代码块(即<% ... %>),因此无法修改控件集合。
- 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Web.HttpException: 控件包含代码块(即 <% ... %> ),因此无法修改控件集合。 - 一、错误例子解说:
- <asp:Panel ID="p_Time" runat="server">
<%= DateTime.Now.ToString("HH-mm")%>
</asp:Panel>
Label lb=new Label();
lb.Text = "当前时间";
p_Time.Controls.Add(lb);
以上代码执行的时候,将会产生该错误。由于p_Time控件中包含了代码块(即<% ... %>),无法修改控件集合,所以当执行语句p_Time.Controls.Add(lb)时会产生错误。 - 二、通常出错的地方以及解决方案
- 通常在页面代码的head部分的javascript代码中通过<%=this.control.ClientID%>来获取服务器控件标识符(代码如下所示)等,当应用主题等功能的时候,服务器脚本会向Header动态添加控件,而引发错误。
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <script type="text/javascript"> function showTime() { var now = new Date(); var lbTime = document.getElementById('<%= this.lb_Time.ClientID %>'); lbTime.innerHTML = now.getHours() + ":" + now.getMinutes(); } </script> </head> <body> <asp:Label ID="lb_Time" runat="server" Text="lb_Time"></asp:Label> <input id="btn_Show" type="button" value="button" onclick="return showTime()" /> </body> </html>
解决方案如下:- 1、把javascript放到body中
- 2、声明自定义控件来代替包含了代码块(即<% ... %>)
- 控件代码:
public class ControlInfoWriter : Control { private string writerControlID; private string writerProperty; public string WriterControlID { get { return writerControlID; } set { writerControlID = value; } } public string WriterProperty { get { return writerProperty; } set { writerProperty = value; } } protected override void Render(System.Web.UI.HtmlTextWriter writer) { object writerControl = this.Parent.FindControl(writerControlID);//查找要输出的控件 Type t = writerControl.GetType();//获取控件的类型 PropertyInfo pi = t.GetProperty(writerProperty);//获取要输出的属性 string value = pi.GetValue(writerControl, null).ToString();//得到控件的属性值 writer.Write(value); base.Render(writer); } }
head中的javascript修改如下:
<script type="text/javascript"> function showTime() { var now = new Date(); var lbTime = document.getElementById('<CustomControl:ControlInfoWriter ID="controlInfoWriter" WriterControlID="lb_Time" WriterProperty="ClientID" runat="server" />'); lbTime.innerHTML = now.getHours() + ":" + now.getMinutes(); } </script>
注:页面代码中要注册控件CustomControl:ControlInfoWriter