如何访问ASP.. NET ITemplate容器属性



我想学习如何使用ITemplate更好的自定义控件。我有它大部分工作,但我还没能弄清楚如何从页面访问容器的任何属性。

这是我的模板控件:

[ParseChildren(true)]
[PersistChildren(false)]
public partial class Example : UserControl
{
private ITemplate _CustomPanelContainer;
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(CustomPanelContainer))]
[TemplateInstance(TemplateInstance.Single)]
public virtual ITemplate CustomPanel
{
get { return _CustomPanelContainer; }
set { _CustomPanelContainer = value; }

}

protected override void CreateChildControls()
{
Controls.Clear();
if (_CustomPanelContainer != null)
{
var p = new Panel();
p.ID = "CustomPanel";
Controls.Add(p);
_CustomPanelContainer.InstantiateIn(p);
}
base.CreateChildControls();
}

public class CustomPanelContainer : Panel, INamingContainer 
{

private string _Test = "TESTING!";
public string TextTest 
{ 
get 
{ 
return _Test;
}
set
{
_Test = value;
}
}
}
}

下面是页面实现:

<uc1:Example runat="server" ID="Example1">
<CustomPanel>
<strong>Test: </strong> <%# Container.TextTest %>
</CustomPanel>
</uc1:Example>

它大部分工作,但问题是<%#容器。文本%比;总是返回一个空字符串。当我在调试器上运行它时,我在CustomPanelContainer的TextTest属性内的行中设置了一个断点,并且该断点从未被击中,因此该属性从未真正被访问过。

我在这里错过了什么?如何通过<%# container访问容器的公共属性?

我终于知道如何让它按我想要的方式运行了。

我删除了ITemplate作为Container的类型,并将该类型设置为实际类型,并在CreateChildControls()中添加了一个DataBind()命令。

这样做可能不太正确,但它是有效的。

让问题保持开放,看看是否有人提出任何批评或更好的方法,因为我真的不知道我在这里做什么。

简化工作代码:
[ParseChildren(true)]
[PersistChildren(false)]
public partial class Example : UserControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
public virtual CustomPanelContainer Template { get; set; }

protected override void CreateChildControls()
{
Controls.Clear();
if (Template != null)
{
Template.DataBind();
Controls.Add(Template);
}
base.CreateChildControls();
}

public class CustomPanelContainer : Panel, INamingContainer
{
public string TextTest
{
get { return "TESTING!"; }
}
}
}

页面实现:

<uc1:Example runat="server" ID="Example">
<Template>
<strong>Test: </strong><span><%# Container.TextTest %></span>
</Template>
</uc1:Example>

EDIT:这也适用于需要隐藏模板类型的情况。我,e。,上面的代码暴露了Template的类型,以允许将Panel的属性作为Template的属性来操作,而下面的代码隐藏了Template的类型,以阻止对其属性的操作。

[ParseChildren(true)]
[PersistChildren(false)]
public partial class Example : UserControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
[TemplateContainer(typeof(CustomPanelContainer))]
public virtual ITemplate Template { get; set; }

protected override void CreateChildControls()
{
Controls.Clear();
if (Template != null)
{
var p = new CustomPanelContainer();
Template.InstantiateIn(p);
p.DataBind();
Controls.Add(p);
}
base.CreateChildControls();
}

public class CustomPanelContainer : Panel, INamingContainer
{
public string TextTest
{
get { return "TESTING!"; }
}
}

最新更新