Ajax UpdatePanel.Refresh() auslösen per Javascript
Vor ein paar Tagen musste ich ein Ajax UpdatePanel.Refresh() per JavaScript auslösen, der Haken daran war es mussten auch noch Zusatzinformationen an den Server übertragen werden.
Die Lösung ist man ruft die JavaScript Funktion "__doPostBack" aus und übergibt als EventTarget die ClientID des UpdatePanel das zu refreshen gilt. Die Zusatzinformationen werden dem EventArgument Parameter der "__doPostBack" Funktion übergeben.
Wenn man keine Parameter bzw. Zusatzinfos an den Server übertragen möchte - also nur das Updatepanel refreshen ist das ganze ziemlich einfach.
Javascript Code:
function refreshUpdatePanel( updatePanelClientID )
{ __doPostBack( updatePanelClientID, '' );
}
Dazu der passende C# Code:
button.OnClientClick =
"BLOCKED SCRIPTrefreshUpdatePanel( '" + updatePanel.ClientID + "' );"+
"return false;";
Zu beachten ist hier lediglich das "
return false" am ende des OnClientClick JavaScripts.
Dieses verhindert einen asp.net postback zurück an den server.
Wenn man Parameter/Zusatzinformationen an den Server zurück schicken möchte wird das ganze allerdings etwas komplizierter.
Javascript Code:
function refreshUpdatePanelParameterized( updatePanelClientID, eventArgumentName )
{ // do javascript stuff to populate event arguments here, like get all checked checkboxes
// or other clientside control content and send it back to the server
// i'll use "nothing" as argument placeholder here
var eventArguments = 'nothing';
__doPostBack( updatePanelClientID, eventArgumentName + '_#_' + eventArguments);
}
C# Code:
protected void Page_Init(object sender, EventArgs e)
{ if ( Request.Params["__EVENTTARGET"] == updatePanel.ClientID )
{ string[] eventsArgs = Request.Params["__EVENTARGUMENT"].Split( new string[]{"_#_"}, StringSplitOptions.RemoveEmptyEntries ); string argumentName = eventsArgs[0];
string argumentValue = eventsArgs[1];
System.Diagnostics.Debug.WriteLine(string.Format("Recieved command {0} with values {1}.", argumentName, argumentValue ) ); }
}
protected void Page_Load(object sender, EventArgs e)
{ button.OnClientClick = "BLOCKED SCRIPTrefreshUpdatePanelParameterized( '" + updatePanel.ClientID + "', 'arg1' ); return false;";
}
Wie das geschulte Auge erkennt werden hier zwei Parameter übertragen, ArgumentName und ArgumentValue. Der "refreshUpdatePanelParameterized" wird der ArgumentName (hier: "arg1") übergeben und die Funktion selbst ermittelt dann noch im JavaScript die ArgumentValue (hier: "nothing" ) und schickt die Informationen als Postback an den Server.
Der Serverseitige C# code "entschlüsselt" diese Informationen wieder in argumentName und argumentValue und verwertet diese anschließend.