ASP.NET自定义控件,模板字段可以有属性吗?

时间:2011-03-03 10:39:32

标签: asp.net custom-controls

例如:

<uc:AdmiralAckbar runat="server" id="myCustomControl">
<Warning SomeAttribute="It's A Trap">
My Data
</Warning>
</uc:AdmiralAckbar>

我不确定如何添加SomeAttribute。有什么想法吗?

没有属性的代码是:

private ITemplate warning = null;

    [TemplateContainer(typeof(INamingContainer))]
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Warning
    {
        get
        {
            return warning;
        }
        set
        {
            warning = value;
        }
    }

1 个答案:

答案 0 :(得分:4)

答案是肯定的。

为此你应该创建一个实现ITemplate接口的类型并在那里添加一个自定义属性/属性(我在我的例子中添加了属性Name);还添加一个继承自Collection<YourTemplate>

的类

这是一个这样做的例子:

public class TemplateList : Collection<TemplateItem> { }

public class TemplateItem : ITemplate
{
    public string Name { get; set; }

    public void InstantiateIn(Control container)
    {
        var div = new HtmlGenericControl("div");
        div.InnerText = this.Name;

        container.Controls.Add(div);
    }
}

和控件本身:

[ParseChildren(true, "Templates"), PersistChildren(false)]
public class TemplateLibrary : Control
{
    public TemplateLibrary()
    {
        Templates = new TemplateList();
    }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public TemplateList Templates { get; set; }

    protected override void RenderChildren(HtmlTextWriter writer)
    {
        foreach (var item in Templates)
        {
            item.InstantiateIn(this);
        }

        base.RenderChildren(writer);
    }
}

最后是一个使用示例:

<my:TemplateLibrary runat="server">
    <my:TemplateItem Name="hello" />
    <my:TemplateItem Name="there" />
</my:TemplateLibrary>
顺便说一句,你也可以用它作为:

<my:TemplateLibrary runat="server">
    <Templates>
        <my:TemplateItem Name="hello" />
        <my:TemplateItem Name="there" />
    </Templates>
</my:TemplateLibrary>

效果会一样。