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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
5月前
|
XML JSON 移动开发
BpmnJS 元素属性的updateProperties 和updateModdleProperties的属性更新区别
BpmnJS 元素属性的updateProperties 和updateModdleProperties的属性更新区别
150 1
|
C++
Qt动态添加控件并设置大小位置等属性
Qt动态添加控件并设置大小位置等属性
970 0
|
JSON JavaScript 数据格式
for in语句,flex布局,Math对象,筛选选择器,属性操作(复习知识)
用for…in遍历数组: 循环变量x是数组的下标 用for…in遍历js对象: 循环变量x是json的成员—属性与方法名 以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。
83 0
|
C++
VS 显示方法引用的设置方法
VS 中Codelens的设置面板没有相关的设置项?那如何调整出方法的引用呢?
2191 0
VS 显示方法引用的设置方法
从模版中找到控件的方法和找到样式的方法
原文:从模版中找到控件的方法和找到样式的方法 this.Style = (Style) App.Current.Resources["BaseWindowStyle"]; 运行下段代码一定要加载样式完成后 i最好是在 Loaded 事件运行完成后加载   ControlTemplate baseWindowTemplate = (ControlTemplate)App.
908 0
phpstrom怎样显示类的方法或函数列表
来源:http://www.ecjson.com/article/28.html
4924 0
|
JavaScript .NET 开发框架