我确信这个问题已被提出并回答;但我还没有找到它......
我正在创建一个非常简单的自定义System.Web.UI.Control,它具有一些属性。我可以在我的ASPX页面中定义以下标记,一切都很开心:
<ns:MyControl runat="server" MyProperty="Value" />
但是,如果我想拥有一个或多个“子”属性,如下所示:
<ns:MyControl runat="server" MyProperty="Value">
<Element AnotherProperty="AnotherValue1" />
<Element AnotherProperty="AnotherValue2" />
</ns:MyControl>
我无法弄清楚我需要做些什么才能使XHTML验证。我总是有
代码实际上按预期运行,但我还没有找到一个关于如何正确执行此操作的好示例,以便一切都有效。在自定义控件的实现方面,我现在只是将所有属性都删除了,看起来像是:
[ParseChildren(true)]
[PersistChildren(false)]
public class MyControl : Control
{
public String MyProperty { get; set; }
public String Element { get; set; }
}
最终,Element旨在建立一系列元素。任何有关如何正确执行此操作以及进行XHTML验证的见解都将非常感激。
提前致谢。
答案 0 :(得分:2)
我在2008年写了一篇关于此的博客文章,你可以在这里找到:Describing ASP.net Control properties declaratively。
基本上,要以这种格式实现标记:
<Abc:CustomControlUno runat="server" ID="Control1">
<Children>
<Abc:Control1Child IntegerProperty="1" StringProperty="Item1" />
<Abc:Control1Child IntegerProperty="2" StringProperty="Item2" />
</Children>
</Abc:CustomControlUno>
您需要以下代码:
[ParseChildren(true)]
[PersistChildren(true)]
[ToolboxData("<{0}:CustomControlUno runat=server></{0}:CustomControlUno>")]
public class CustomControlUno : WebControl, INamingContainer
{
private Control1ChildrenCollection _children;
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Control1ChildrenCollection Children
{
get
{
if (_children == null)
_children = new Control1ChildrenCollection();
return _children;
}
}
}
public class Control1ChildrenCollection : List<Control1Child>
{
}
public class Control1Child
{
private int integerProperty;
private string stringProperty;
public string StringProperty
{
get { return stringProperty; }
set { stringProperty = value; }
}
public int IntegerProperty
{
get { return integerProperty; }
set { integerProperty = value; }
}
}
答案 1 :(得分:0)
查看ASP.NET Menu
控件以获取序列化子元素集合的示例。此控件使用一个名为<Items>
的内部属性,该属性包含菜单项的集合
您可以模仿Items
属性的定义(为了清晰起见而明确)。
[PersistenceMode(PersistenceMode.InnerProperty)]
public MenuItemCollection Items
{
get { /* ... */ }
}
请注意,如果您打算将集合序列化为内部属性,则可能需要从类定义中删除[ParseChildren(true)]
和[PersistChildren(false)]
。
如果您希望仅支持一个子集合(la DropDownList
),那么您可以替换PersistenceMode.InnerDefaultProperty
的持久性模式,并且能够在没有包装元素的情况下添加项目。< / p>