Для этого лучше наследоваться от System.Web.UI.WebControls.WebControl с реализацией интерфейса INamingContainer - это гарантирует уникальность идентификаторов (имен) дочерних контролов.
Контрол должен реализовать javascript, с проверкой регистрации и подстановкой уникальных имен.
Типа:
string imageLoadScriptKey = "rolloverImageBuildingCode" + this.ClientID;
string script = @"
%3c%21--
" + this.ClientID + "_img_out = new Image(); " +
this.ClientID + @"_img_out.src = """ + this.ImageUrl + @""";
" + this.ClientID + "_img_over = new Image(); " +
this.ClientID + @"_img_over.src = """ + this.RollOverImageUrl + @""";
// --%3e
";
Page.RegisterClientScriptBlock(imageLoadScriptKey, script);
если на странице размещается несколько однотипных контролов и достаточен один клиент-скрипт то нужно осуществить проверку (чтоб не плодить скрипты)
if(!this.IsClientScriptBlockRegistered("imageLoadScriptKey"))
{
...
}
Перевернув мир - оглянись, может перевернулся ты сам?!