ASP.NET自定义控件,是否可以限制模板的内容?

时间:2011-03-03 11:22:14

标签: asp.net custom-controls

某些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中列出的两个特定控件之外,您不能在Triggers部分放置任何内容,如果您尝试,则会出现设计时错误。这是我想模仿的确切行为。

====

我试图实施Alex的建议,这是我的代码:

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 个答案:

答案 0 :(得分:2)

编辑:google docs添加了指向此示例的链接。

首先,构建网站,然后您就可以将此控件与IntelliSense一起使用。

实际上,<Triggers>的{​​{1}}属性不是模板。它只是一个对象的集合。你可以通过声明自己的类和继承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部分添加任何内容。