Пользовательский элемент управления ASP.NET, могут ли поля шаблона иметь атрибуты? - PullRequest
3 голосов
/ 03 марта 2011

Например:

<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 голосов
/ 03 марта 2011

Ответ - да.

Для этого вы должны создать тип, который реализует интерфейс 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>

эффект будет таким же.

...