I controlli compositi (la maggior parte) sono dei controlli che contengono altri controlli al proprio interno. In ASP.NET 1.x per creare un controllo composito è necessario ereditare da WebControl, implementare INamingContainer e verificare sempre che i controlli child siano stati creati correttamente (EnsureChildControls) almeno a design time.
In ASP.NET 2.0 si è deciso di semplificare la vita, in quanto basta ereditare da CompositeControl ed il gioco è fatto.