Oggi mi è stato chiesto a bruciapelo (cito testualmente) "...un modo per eseguire il refresh di un UpdatePanel tramite un evento javascript (ad esempio onblur di un input text)...".
Se ci pensiamo bene, questo tipo di scelta implementativa va "filosoficamente" contro i principi di AJAX. Infatti (assumendo che il browser supporti Javascript :)), è maggiormente corretto utilizzare il più possibile le API AJAX del framework client-side per gestire il comportamento dei controlli client-side, al fine di evitare round-trip dispendiosi e spesso inutili verso il server (uno degli obiettivi primari di AJAX, d'altronde, è proprio questo :)).
Si pensi al caso di un' invocazione di un Web Service: gestirla direttamente tramite il framework lato client permette di risparmiare un round-trip!
Potremmo discutere sulla questione all'infinito...;)
Ad ogni modo, una soluzione veloce al problema potrebbe consistere nel forzare da Javascript il PostBack della pagina nei confronti di un controllo impostato come Trigger del nostro UpdatePanel. Come controllo potremmo usare ad esempio un HiddenField:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Test UpdatePanel 'OnBlur' su Input Text</title>
<script type="text/javascript">
function postBackHF(hiddenFieldID)
{
var hiddenField = $get(hiddenFieldID);
if (hiddenField)
{
hiddenField.value = (new Date()).getTime();
__doPostBack(hiddenFieldID,'');
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Test UpdatePanel 'OnBlur' su Input Text</h1>
<asp:ScriptManager ID="TestScriptManager" runat="server" />
<asp:UpdatePanel ID="UpdatePanelTest" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<ContentTemplate>
<div style="background-color: #FFFF00; padding: 10px;">
<h2>UpdatePanel</h2>
<input type="text" id="testTB" value="Scatena l'OnBlur..."
onblur="postBackHF('<%=HiddenFieldTest.ClientID %>')" />
<br />
<asp:HiddenField ID="HiddenFieldTest" runat="server" />
<asp:Label ID="Outputlbl" runat="server" Text="Label"></asp:Label>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="HiddenFieldTest" EventName="ValueChanged" />
</Triggers>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
E nel CodeFile...
...
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack)
{
Outputlbl.Text = "UpdatePanel Refreshed: " + DateTime.Now.ToString();
}
}
...
Come si può osservare, all'occorrenza dell' evento "onblur" della nostra textbox, andiamo a cambiare il valore lato client del nostro HiddenField di appoggio. Quindi, forziamo il __doPostBack() in modo da scatenarne, lato server, l'evento ValueChanged, ovvero il Trigger che invocherà automaticamente il metodo Update() del nostro UpdatePanel.
In questo caso si è scelto di impostare l'evento ValueChanged dell' HiddenField come AsyncPostBackTrigger in quanto la proprietà ChildrenAsTriggers dell'UpdatePanel è impostata su "False". E' chiaro che si può pensare di implementare questo scenario in tanti altri modi diversi :)...