Der
standard Weg um ASP .NET Seiten zu ajaxen ist momentan das ajaxToolkit würd ich sagen.
Die
DevExpress Komponenten bieten jedoch eigene Mechanismen, wie das ASPxCallbackPanel, den ASPxCallback oder das ASPxGridView und die ASPxTreeList auf denen man in JavaScript per
PerformCallback einen AJAX Request auf den Server absetzen kann. Arbeitet man
auschließlich mit DevExpress kann man auf die Funktionalität des ajaxToolkit deshalb gut
verzichten.
Der PerformCallback Funktion übergibt man als Parameter einen String, welchen
man auf dem Server auswerten kann. Serverseitig übergibt man dann den CallbackEventArgs
wiederum einen String (e.Result) welchen man dann clientseitig in dem
CallbackComplete Event verwenden kann:
Callback Definition:
<dxcb:ASPxCallback ID="cb"
runat="server"
ClientInstanceName="cb"
OnCallback="cb_Callback"
ClientSideEvents-CallbackComplete="cbComplete" />
Callback auslösen:
function doCb () {
cb.PerformCallback('Welt');
}
Handler serverseitig:
protected void cb_Callback(object s,
CallbackEventArgs e)
{
e.Result = "Hallo " +
e.Parameter;
}
Handler clientseitig:
function cbComplete (s, e) {
alert(e.result);
}
So weit so
gut… Oder schlecht? Nur Strings als Parameter??? Ein bischen unelegant, unpraktisch
und so gar nicht objekt orietiert!
Die
Alternative: JSON, die javascript
object notation.
Damit
können wir sowohl client- als auch serverseitig mit Objekten arbeiten. Diese
Objekte serialisieren wir in einen JSON String, welchen wir als Callback-Parameter
verwenden können und welcher sich vom Empfänger einfach deserialisieren lässt.
Hätten wir
also jeweils zwei JavaScript und C# Functionen:
string
s = ToJSON(object o);
object
o = FromJSON(string s);
sähe die
Kommunikation schon eleganter aus.
Bitte sehr:
http://www.thomasfrank.se/downloadableJS/jsonStringify.js
http://james.newtonking.com/projects/json-net.aspx
Ok, clientseitig
die JavaSript Datei einbinden, serverseitig eine Referenz auf Newtonsoft.Json
und los gehts:
Callback auslösen:
function doCb () {
var customer = new
Object();
customer.Id =
1;
customer.FirstName
= "Hans";
customer.LastName
= "Dampf";
customer.Orders
= new Array("a",
" b");
cb.PerformCallback(JSONstring.make(customer));
}
Handler serverseitig:
public class Customer
{
public long
Id { get; set;
}
public string
FirstName { get; set;
}
public string
LastName { get; set;
}
public List<string> Orders { get;
set; }
}
protected void cb_Callback(object s,
CallbackEventArgs e)
{
Customer c = JsonConvert.DeserializeObject<Customer>(e.Parameter);
c.Orders.Add("c");
e.Result = JsonConvert.SerializeObject(c);
}
Handler clientseitig:
function cbComplete (s, e) {
var c =
JSONstring.toObject(e.result);
alert(c.Orders.length);
}