Passe objets complexes à javascript via IScriptControl
-
22-09-2019 - |
Question
Je suis jouer avec une page asp.net qui est à l'aide de l'interface IScriptControl pour transmettre des données à partir du code-behind de l'objet personnalisé javascript en cours d'exécution sur le navigateur.
Je passe un certain nombre de propriétés par IScriptControl.GetScriptDescriptors (), et ils travaillent tous très bien, sauf un.
Celui-là est une classe dérivée de System.Collections.Generic.Dictionary <>. Et même que l'on travaille pour moi, tant que les éléments de la collection étaient - ints, scalaires doubles, et les chaînes. Mais quand j'essayé de passer un membre d'une classe, il est apparu comme un objet nul dans le javascript. La classe en question est marquée [Serializable]. Je l'ai changé à un struct, et a obtenu le même comportement.
Il semble que si le sérialiseur utilisé dans IScriptControl ne une copie superficielle. J'ai besoin d'une copie en profondeur.
Toutes les idées?
La solution
Eh bien, personne d'autre est de répondre à cette. Ceci est vraiment pas une réponse, mais le champ de commentaire est un peu petite.
Je codé un petit exemple stupide, dont au moins regarde comme cela fonctionne. Qu'est-ce que je manque, ce que je ne fais que vous êtes?
Il fait ce à sortir à 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
}
}