Passando oggetti complessi a JavaScript tramite IScriptControl
-
22-09-2019 - |
Domanda
Sto giocando intorno con una pagina di asp.net che sta utilizzando l'interfaccia IScriptControl per passare i dati dal code-behind al costume JavaScript Object in esecuzione sul browser.
Sto passando una serie di proprietà tramite IScriptControl.GetScriptDescriptors (), e sono tutti lavorando bene, tranne uno.
Quello è una classe derivata da System.Collections.Generic.Dictionary <>. E anche che uno ha lavorato per me, fino a quando gli elementi della collezione sono stati scalari - int, doppie, e stringhe. Ma quando ho cercato di superare un membro di una classe, si presentò come un oggetto nullo nel JavaScript. La classe in questione è contrassegnata [Serializable]. Ho cambiato in una struttura, ed ho ottenuto lo stesso comportamento.
Sembra che il serializzatore utilizzato in IScriptControl fa una copia. Ho bisogno di una copia completa.
Tutte le idee?
Soluzione
Bene, nessun altro è rispondere a questa. Questo non è davvero una risposta, ma il campo di commento è un po 'piccola.
ho codificato un piccolo esempio stupido, che almeno Look come funziona. Quello che mi manca, che cosa sto facendo, non che sei?
Essa provoca questa uscita sia alla pagina:
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();
Ed ecco la fonte:
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
}
}
Altri suggerimenti
Io suggerirei di usare un 3rd party libreria JSON. Ci sono diversi tra cui scegliere qui .