原文 http://www.cnblogs.com/jsonzheng/archive/2011/01/18/1938403.html
- 控件包含代码块(即<% ... %>),因此无法修改控件集合。
-
说明: 执行当前 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动态添加控件,而引发错误。
<
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
作者:郑某人 出处:http://jsonzheng.cnblogs.com 欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能推荐或关注