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

3

例如:

<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个回答

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>

效果将是相同的。

嗨,当我尝试从ITemplate继承时,我收到一条消息“类只能从其他类继承”,谢谢。 - Yisroel M. Olewski
@Yisman,假设您正在使用VB,应该使用Implements而不是Inherits(因为这是一个接口)。 - Oleks
也许我错过了什么,但是这段代码生成的ITemplate对象(该自定义类型)没有在它们下面构建标记控件树?实现自定义的“InstantiateIn”有点违背标记模板的初衷.. - user166390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接