Spesso nelle nostre applicazioni ASP.NET ci troviamo di fronte all'esigenza di aggiungere controlli in fase di run-time in modo da rendere completamente dinamico il comportamento delle nostre pagine. Ultimamente mi sono scontrato con la necessità di utilizzare questa tecnica all'interno del controllo UpdatePanel di ASP.NET AJAX.
Anzitutto, è importante precisare come non sia possibile aggiungere controlli direttamente nell'UpdatePanel (non possiamo quindi fare una cosa di questo tipo: MyUpdatePanel.Controls.Add(...)). Siamo quindi vincolati a prevedere dei container (es. Panel) da collocare nel ContentTemplateContainer dell' UpdatePanel per procedere all'aggiunta dei nostri controlli.
Uno dei modi più veloci e funzionali per poter poi riuscire a determinare quale controllo run-time all'interno dell' UpdatePanel ha generato un evento in modalità AsyncPostBack, sfrutta semplicemente l'oggetto Request della pagina relativamente allo ScriptManager dichiarato.
Andando in ordine, questa è una pagina di esempio:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>UpdatePanel con controlli Run-Time</title>
</head>
<body>
<h1>UpdatePanel con controlli Run-Time</h1>
<form id="form1" runat="server">
<div>
ID="MyScriptManager" runat="server" EnablePartialRendering="true" />
ID="MyUpdatePanel" runat="server" UpdateMode="Conditional" RenderMode="Block">
ID="StatusLbl" runat="server"></asp:Label>
<br />
<br />
ID="ControlsPanel1" runat="server"></asp:Panel>
<br />
ID="ControlsPanel2" runat="server"></asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
E questo è il relativo CodeFile.
...
protected void Page_Load(object sender, EventArgs e)
{
AddMyControls(); // Aggiunta dei controlli alla Pagina
if (MyScriptManager.IsInAsyncPostBack)
{
string MyScriptManagerRequest = Request[MyScriptManager.ID];
// Visualizziamo il contenuto della richiesta dello ScriptManager
StatusLbl.Text = MyScriptManagerRequest ;
if (MyScriptManagerRequest.Contains("Button1"))
{
// Fai qualcosa...
}
else if (MyScriptManagerRequest.Contains("Button2"))
{
// Fai qualcosa...
}
}
}
private void AddMyControls()
{
Button button1 = new Button();
button1.ID = "Button1";
...
Button button2 = new Button();
button2.ID = "Button2";
...
ControlsPanel1.Controls.Add(button1);
ControlsPanel2.Controls.Add(button2);
}
...
Occorre porre attenzione al fatto che il contenuto di Request[MyScriptManager.ID] , ovvero la stringa nel POST Http corrispondente al nostro ScriptManager (MyScriptManager), contiene qualcosa del tipo "<ID UpdatePanel>|<ID Controllo>" (nel nostro caso ad esempio "MyUpdatePanel|Button1").
Possiamo quindi processare questa stringa per capire quale controllo ha causato il PostBack asincrono e quindi procedere con la nostra logica di business.