通过IScriptControl传递复杂对象的JavaScript
-
22-09-2019 - |
题
我玩弄与同时使用的IScriptControl接口从数据传递一个asp.net页面代码隐藏在浏览器上运行的自定义JavaScript对象。
我传递经由IScriptControl.GetScriptDescriptors许多属性(),并且它们都工作正常,除了一个。
这是一个从System.Collections.Generic.Dictionary <>派生的类。即使是一个已经工作对我来说,只要集合中的元素是标量 - 整型,双打和字符串。但是,当我试图通过一个类的成员,它显示了根据JavaScript一个空对象。所讨论的类被标记[序列化]。我改成了一个结构,并得到了同样的情况。
这看起来好像在IScriptControl使用串行化器确实浅表副本。我需要深层副本。
任何想法?
解决方案
好了,没有其他人回答这个。这真的不是一个答案,但注释字段是小了点。
我编写了一个愚蠢的小例子,其中至少长相像它的工作原理。我在想什么,那我不这样做,你是?
它会导致这要被输出到页:
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();
和这里的源:
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
}
}
其他提示
我会建议使用第三方JSON库。有几个从这里选择。
不隶属于 StackOverflow