¿Cómo construyes un control personalizado ASP.NET con una propiedad de colección?


12

Estoy mirando para hacer algo similar a

<cstm:MyControl runat="server"> 
    <myItem attr="something" /> 
    <myItem attr="something" /> 
</cstm:MyControl> 

Cuál es el código esqueleto necesario para sacar esto adelante?

ejemplo de Rick muestra algo parecido a

<cstm:MyControl runat="server"> 
    <myItems> 
     <cstm:myItem attr="something" /> 
     <cstm:myItem attr="something" /> 
    </myItems> 
</cstm:MyControl> 

prefiero la sintaxis más concisa si es posible.

Nota: No dude en sugerir un título o una descripción mejor. Incluso si no tiene derechos de edición, me complace editar la entrada por el bien de la comunidad.

  0

Yo sugeriría cambiar el título de este a ser "¿Cómo construyes un control personalizado ASP.NET con una propiedad de colección predeterminada?", ya que hay algunas explicaciones sobre la construcción de un control con una propiedad de colección declarativa, pero pocas explican cómo convertirla en la propiedad predeterminada. 23 sep. 082008-09-23 21:10:07

17

Aquí hay una muy simple control de ejemplo que hace exactamente lo que busca:

namespace TestControl 
{ 
    [ParseChildren(true, DefaultProperty = "Names")] 
    public class MyControl : Control 
    { 
     public MyControl() 
     { 
      this.Names = new List<PersonName>(); 
     } 

     [PersistenceMode(PersistenceMode.InnerDefaultProperty)] 
     public List<PersonName> Names { get; set; } 
    } 

    public class PersonName 
    { 
     public string Name { get; set; } 
    } 
} 

Y, aquí es un ejemplo de uso:

<%@ Register Namespace="TestControl" TagPrefix="TestControl" %> 

<TestControl:MyControl runat="server" ID="MyControl1"> 
    <TestControl:PersonName Name="Chris"></TestControl:PersonName> 
    <TestControl:PersonName Name="John"></TestControl:PersonName> 
</TestControl:MyControl>