控件包含代码块,因此无法修改控件集合

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 原文 http://www.cnblogs.com/jsonzheng/archive/2011/01/18/1938403.html 控件包含代码块(即),因此无法修改控件集合。 说明: 执行当前 Web 请求期间,出现未处理的异常。

原文 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动态添加控件,而引发错误。
?
< 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

作者:郑某人 出处:http://jsonzheng.cnblogs.com 欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能推荐或关注

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
JSON 自然语言处理 JavaScript
介绍16个让你的代码变漂亮的属性
介绍16个让你的代码变漂亮的属性
317 0
介绍16个让你的代码变漂亮的属性
|
7月前
|
XML JSON 移动开发
BpmnJS 元素属性的updateProperties 和updateModdleProperties的属性更新区别
BpmnJS 元素属性的updateProperties 和updateModdleProperties的属性更新区别
273 1
WPF属性---重复样式和触发器
WPF属性---重复样式和触发器
126 0
|
数据库 C#
C# GridControl列表动态赋值
C# GridControl列表动态赋值
229 3
C# GridControl列表动态赋值
|
C++
Qt动态添加控件并设置大小位置等属性
Qt动态添加控件并设置大小位置等属性
1040 0
javascrip 修改元素属性 - 切换图片
javascrip 修改元素属性 - 切换图片
78 0
javascrip 修改元素属性 - 切换图片
|
JavaScript 前端开发
42、属性的操作
元素对象有一个attributes属性,返回一个类似数组的动态对象,成员是该元素标签的所有属性节点对象,属性的实时变化都会反映在这个节点对象上。其他类型的节点对象,虽然也有attributes属性,但返回的都是null,因此可以把这个属性视为元素对象独有的。
173 0
|
C++
VS 显示方法引用的设置方法
VS 中Codelens的设置面板没有相关的设置项?那如何调整出方法的引用呢?
2257 0
VS 显示方法引用的设置方法
|
C# C++
WPF附加属性的Set函数不调用的问题
原文:WPF附加属性的Set函数不调用的问题 今天写程序的时候用到了附加属性,我是用VS内置的propa的代码段来实现的,代码如下:     class Attach    {        public static bool GetIsEnabl...
854 0
phpstrom怎样显示类的方法或函数列表
来源:http://www.ecjson.com/article/28.html
4938 0