ScriptManager.RegisterDataItem - envoyer des données à travers un UpdatePanel
Je viens de découvrir la méthode ScriptManager.RegisterDataItem, cette méthode permet de transférer des données entre le serveur et le client lors d'un AsyncPostback. Pour ceux qui ne sont pas familier avec les asyncpostback, un asyncpostback reprend le mécanisme d'un postback classique sauf qu'il se fait via Ajax (XMLHttpRequest) et ne rafraichit que certaines parties de la page, ces zones sont définies via les UpdatePanels.
En plus d'envoyer le contenu HTML des UpdatePanels à rafraichir, la méthode RegisterDataItem permet de transférer les données que l'on souhaite. Cette méthode dispose de deux signatures, soit l'on envoie un simple string, soit on envoie un objet complexe sérialiser en JSON.
// permet de renvoyer un simple string associé au ClientID d'un contrôle
ScriptManager1.RegisterDataItem(Label1, DateTime.Now.ToString());
// permet d'envoyer des données au format JSON
JavaScriptSerializer serializer = new JavaScriptSerializer();
Person p = new Person("Cyril", "Durand");
ScriptManager1.RegisterDataItem(Label2, serializer.Serialize(p), true);
Pour récupérer les données côtés clients, il faut s'abonner à l'événement pageLoading du pageRequestManager :
Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(function(sender, args){
var dataItems = args.get_dataItems();
var serverDate = dataItems['ClientID_Label1'];
var person = dataItems['clientID_Label2'];
});
Je trouve néanmoins dommage que la clé soit un objet de type Control et non un simple String, en effet, cela nécessite de connaitre le clientID du contrôle ce qui n'est pas toujours facile.