2010-03-24 6 views
2

Je joue avec une page asp.net qui utilise l'interface IScriptControl pour transmettre des données du code-behind à l'objet javascript personnalisé exécuté sur le navigateur.Passage d'objets complexes à javascript via IScriptControl

Je passe un certain nombre de propriétés via IScriptControl.GetScriptDescriptors(), et ils fonctionnent tous bien, sauf un.

Celle-ci est une classe dérivée de System.Collections.Generic.Dictionary <>. Et même celui-là a travaillé pour moi, tant que les éléments de la collection étaient scalaires - ints, doubles et cordes. Mais quand j'ai essayé de passer un membre d'une classe, il s'est présenté comme un objet nul dans le javascript. La classe en question est marquée [Serializable]. Je l'ai changé en struct, et j'ai eu le même comportement.

Il semble que le sérialiseur utilisé dans IScriptControl effectue une copie superficielle. J'ai besoin d'une copie profonde.

Des idées?

+0

IScriptControl est l'interface, quelle classe utilisez-vous? Ou, à quoi ressemble votre définition de GetScriptDescriptors()? EDIT: nevermind, vous passez vos objets à travers ScriptControlDescriptor.AddProperty, non? D'accord. –

+0

Exactement. Et c'est sérialiser l'objet, mais seulement un niveau profond. –

Répondre

1

Eh bien, personne d'autre ne répond à cette question. Ce n'est vraiment pas une réponse, mais le champ de commentaire est un peu petit.

J'ai codé un petit exemple stupide, qui au moins ressemble comme ça fonctionne. Qu'est-ce qui me manque, qu'est-ce que je ne fais pas?

Il provoque que ce soit sortie à la page:

Sys.Application.add_init(function() { 
    $create(NS, {"d1":{"t1":{"j1":1,"s1":{"Capacity":16,"MaxCapacity":2147483647,"Length":1}}}}, null, null, $get("__Page")); 
}); 
Sys.Application.initialize(); 

Et voici la source:

using System; 
using System.Web; 
using System.Web.UI; 
using System.Collections.Generic; 
using System.Text; 

namespace Debuggin 
{ 
    public class Test 
    { 
     public int j1 = 1; 
     private int j2 = 2; 
     public StringBuilder s1 = new StringBuilder("x"); 

     public override string ToString() 
     { 
      return "Test obj"; 
     } 
    } 

    public partial class _Default : System.Web.UI.Page, IScriptControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected override void OnInit(EventArgs e) 
     { 
      Page.Init += delegate(object sender, EventArgs e_Init) 
      { 
       if (ScriptManager.GetCurrent(Page) == null) 
       { 
        ScriptManager sMgr = new ScriptManager(); 
        Page.Form.Controls.AddAt(0, sMgr); 
       } 
      }; 
      base.OnInit(e); 
     } 


     protected override void OnPreRender(EventArgs e) 
     { 
      base.OnPreRender(e); 
      ScriptManager.GetCurrent(Page).RegisterScriptControl(this); 
      ScriptManager.GetCurrent(Page).RegisterScriptDescriptors(this); 
     } 



     #region IScriptControl Members 

     public System.Collections.Generic.IEnumerable<ScriptDescriptor> GetScriptDescriptors() 
     { 
      ScriptControlDescriptor descriptor = new ScriptControlDescriptor("NS", this.ClientID); 

      Dictionary<string, object> d = new Dictionary<string, object>(); 
      d.Add("t1", new Test()); 
      descriptor.AddProperty("d1", d); 

      return new ScriptDescriptor[] { descriptor }; 

     } 

     public System.Collections.Generic.IEnumerable<ScriptReference> GetScriptReferences() 
     { 
      return new ScriptReference[]{}; 
     } 

     #endregion 

    } 
} 
+0

Merci pour l'exemple. Quand je l'ai exécuté, il est devenu clair pour moi quel était le problème - seuls les membres du public et les propriétés étaient en série. –

0

Je suggère d'utiliser une 3ème partie bibliothèque JSON. Il y en a plusieurs à choisir parmi here.