某些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 >
答案 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
部分添加任何内容。