ASP.NET Custom control, возможно ли ограничить содержимое шаблона? - PullRequest
0 голосов
/ 03 марта 2011

Некоторые элементы управления ASP.NET разрешают только элементы определенных типов, например:

<uc:MyControl runat="server"....>

<MyTableTemplate>
  <MyTableRow .... />
  <MyTableRow .... />
  <MyTableRow .... />
</MyTableTemplate>

</uc:MyControl>

Я пытаюсь воссоздать это в своем собственном пользовательском элементе управления, так что вы можете помещать объекты MyTableRow только вШаблон и Visual Studio будут препятствовать тому, чтобы дизайнер вставлял что-либо еще.

Я смотрел на класс ControlBuilder , но я не совсем уверен, что он делает то, что я хочу.Кроме того, в примерах не упоминается вложенность, которую я имел выше, где массив MyTableRow находится в другом поле шаблона.

Кто-нибудь знает, как этого добиться?

Редактировать: Кажется, что UpdatePanel работаеттаким образом: если вы объявите UpdatePanel следующим образом:

<asp:UpdatePanel>
<Triggers>

</Triggers>
</asp:UpdatePanel>

Вы не можете поместить в раздел «Триггеры» ничего, кроме двух конкретных элементов управления, перечисленных в intellisense, и при попытке получить ошибку времени разработки.Это именно то поведение, которое я хочу имитировать.

====

Я попытался реализовать предложение Алекса, вот мой код:

public partial class MyControl : System.Web.UI.UserControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ActionButtonCollection ActionButtons
    {
        get;
        set;
    }
}


public class ActionButtonCollection : Collection<ActionButton>
{

}

public abstract class ActionButtonBase
{
    public string Test { get; set; }
}

public class ActionButton : ActionButtonBase
{

}

Однако с этимкод, внутри которого нет смысла

<uc:MyCustomControl runat="server">
<ActionButtons>

</ActionButtons>
</uc:MyCustomControl >

1 Ответ

2 голосов
/ 03 марта 2011

РЕДАКТИРОВАТЬ: добавил ссылку на пример выполнения этого для Google Docs .

Во-первых, создайте веб-сайт, и тогда вы сможете использовать этоуправление с IntelliSense.

На самом деле, <Triggers> свойство UpdatePanel не является шаблоном.Это просто набор объектов.Вы можете достичь этого, объявив свой собственный класс и класс, который наследует Collection<YourClass>;затем просто добавьте открытое свойство типа Collection<YourClass> в свой элемент управления, и вы сможете заархивировать поведение «триггеры панели обновления».

Вот пример:

public abstract class UpdatePanelTrigger
{
    public string ControlId { get; set; }
}

public class UpdatePanelTrigger1 : UpdatePanelTrigger
{

}

public class UpdatePanelTrigger2 : UpdatePanelTrigger
{

}

public class UpdatePanelTriggerCollection : Collection<UpdatePanelTrigger>
{

}

и, наконец, ваш контроль:

public class MyControl : WebControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public UpdatePanelTriggerCollection Triggers { get; set; }
}

тогда вы можете использовать его на своей странице:

<my:MyControl runat="Server">
    <Triggers>
        <my:UpdatePanelTrigger1 ControlId="ctrl1" />
        <my:UpdatePanelTrigger2 ControlId="ctrl2" />
    </Triggers>
</my:MyControl>

Кстати, вы не можете поместить в раздел Triggers ничего, кроме типов, которые наследуются от класса UpdatePanelTrigger.

...