Come si crea un controllo personalizzato ASP.NET con una proprietà della raccolta?


12

sto cercando di fare qualcosa di simile a

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

Qual è il codice di ossa nude necessario per tirare fuori questo?

esempio di Rick mostra qualcosa di simile a

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

preferisco la sintassi più concisa, se possibile.

Nota: Sentiti libero di suggerire un titolo o una descrizione migliori. Anche se non hai i diritti di modifica, sono lieto di modificare la voce per il bene della community.

  0

vorrei suggerire cambiando il titolo di questo a essere "Come si crea un controllo personalizzato ASP.NET con una proprietà di raccolta predefinita?", poiché ci sono alcune spiegazioni sulla creazione di un controllo con una proprietà di raccolta dichiarativa, ma pochi spiegano come renderlo la proprietà predefinita. 23 set. 082008-09-23 21:10:07

17

Ecco davvero un controllo semplice esempio che fa esattamente quello che stai cercando:

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

Ed, ecco un esempio di utilizzo:

<%@ 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>