Sto lavorando molto con Ajax Control Toolkit e mi sono imbattuto in un problema un pò particolare. Volevo aprire in una pagina web una finestra "modale" che doveva contenere uno web user control. Utilizzando ModalPopupExtender sembra tutto semplice ma purtroppo questo fantastico controllo non permette di accedere ai controlli all'interno di uno web user control. La soluzione è arrivata tramite questo blog in (penso) cinese. Ma andiamo con ordine. Supponiamo di avere uno user control fatto in questo modo

<asp:Panel ID="ModalDialogPanel" runat="server"
Width="300" style="padding: 10px; border:solid 1px black;">
ASP.NET AJAX is a free framework for building a new...
<br />
<br />
<asp:Button ID="OkButton" runat="server" Text="OK" />
<asp:Button ID="CancelButton" runat="server" Text="Cancel" />
</asp:Panel>

Per utilizzare una finestra modale è sufficiente nella pagina web aggiungere il ModalPopupExtender e il Web User Control:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:LinkButton ID="LinkButton1" runat="server">
Click Here to Popup a Modal Dialog
</asp:LinkButton>
<ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender" runat="server"
TargetControlID="LinkButton1"
PopupControlID="ModalDialog, ModalDialogPanel"
OkControlID="ModalDialog, OkButton"
CancelControlID="ModalDialog, CancelButton"
OnResolveControlID="ModalPopupExtender_ResolveControlID" />
<uc1:ModalDialog ID="ModalDialog" runat="server" />

Si può notare che a differenza del normale utilizzo del ModalPopupExtender le proprietà PopupControlID, OkControlID, CancelControlID, ... contengono sia il riferimento allo UserControl che alla proprietà da utilizzare. Per riuscire quindi a far trovare il controllo è infine sufficiente scrivere un metodo che lo vada a trovare (ModalPopupExtender_ResolveControlID):

protected void ModalPopupExtender_ResolveControlID(
object sender, ResolveControlEventArgs e)
{
if (e.ControlID == null) return;
string[] controlIds = e.ControlID.Split(',');
Control result = this;
foreach (string id in controlIds)
{
result = result.FindControl(id.Trim());
}
e.Control = result;
}

Questo codice consente al ModalPopupExtander di trovare i controlli e funzionare correttamente.