繁体   English   中英

使用Custom System.Web.UI.Control时如何使XHTML验证更快乐?

[英]How to make XHTML validation happy when using Custom System.Web.UI.Control?

我确信这个问题已被提出并回答; 但我还没有找到它......

我正在创建一个非常简单的自定义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验证。 我一直都有

  • 元素'XXX'的开始和结束标记之间不允许有内容
  • 元素'XXX'不受支持
  • 该名称包含大写字符,不允许使用

代码实际上按预期运行,但我还没有找到一个关于如何正确执行此操作的好示例,以便一切都有效。 在自定义控件的实现方面,我现在只是将所有属性都删除了,看起来像是:

  [ParseChildren(true)]
  [PersistChildren(false)] 
  public class MyControl : Control
  {
    public String MyProperty { get; set; }
    public String Element { get; set; }
  }

最终,Element旨在建立一系列元素。 任何有关如何正确执行此操作以及进行XHTML验证的见解都将非常感激。

提前致谢。

我在2008年写了一篇关于此的博客文章,您可以在此处找到:以声明方式描述ASP.net控件属性

基本上,要以这种格式实现标记:

<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; }
    }
}

查看ASP.NET Menu控件以获取序列化子元素集合的示例。 此控件使用单个内部属性,称为<Items> ,其中包含菜单项的集合您可以模仿Items属性的定义(为清晰起见,已明确)

[PersistenceMode(PersistenceMode.InnerProperty)]
public MenuItemCollection Items
{
    get { /* ... */ }
}

请注意,如果要将集合序列化为内部属性,则可能需要从类定义中删除[ParseChildren(true)][PersistChildren(false)]

如果您希望仅支持一个DropDownList (一个DropDownList ),那么您可以替换PersistenceMode.InnerDefaultProperty的持久性模式,并且能够添加没有包装元素的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM