如何在ASP.NET自定义控件中访问ITemplate容器的公共属性
问题根因
你遇到的问题由两个配置遗漏导致:
- 模板实例化时传入的容器类型错误:你在
CreateChildControls方法中,给_CustomPanelContainer.InstantiateIn()传入的是原生Panel类的实例,而非你自定义的CustomPanelContainer容器类。页面模板中<%# Container %>实际指向的是你传入的这个原生Panel实例,自然不存在你定义的TextTest属性,所以断点永远不会触发。 - 数据绑定逻辑未触发:
<%# %>是ASP.NET的数据绑定语法,只有对应控件执行了DataBind()方法时,里面的表达式才会被求值执行。
修复步骤
1. 修正控件的模板实例化逻辑
修改CreateChildControls方法,将创建容器的逻辑替换为你自定义的CustomPanelContainer类型,可选补充自动数据绑定逻辑:
protected override void CreateChildControls() { Controls.Clear(); if (_CustomPanelContainer != null) { // 替换为自定义容器类,而不是原生Panel var p = new CustomPanelContainer(); p.ID = "CustomPanel"; Controls.Add(p); _CustomPanelContainer.InstantiateIn(p); // 可选:在这里主动触发数据绑定,页面侧就不需要手动调用DataBind了 p.DataBind(); } base.CreateChildControls(); }
2. (可选)页面侧手动触发绑定
如果你没有在控件内部加自动绑定逻辑,需要在页面的生命周期中(比如Page_Load)调用控件的DataBind方法:
protected void Page_Load(object sender, EventArgs e) { Example1.DataBind(); }
修复完成后,<%# Container.TextTest %>就能正常读取到属性值,断点也会正常触发。
内容的提问来源于stack exchange,提问作者Plumbtrician
相关产品推荐
相关产品推荐

