首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过IScriptControl将复杂对象传递给javascript

通过IScriptControl将复杂对象传递给javascript
EN

Stack Overflow用户
提问于 2010-03-25 07:18:17
回答 2查看 1.2K关注 0票数 2

我正在处理一个asp.net页面,它使用IScriptControl接口将数据从代码隐藏传递到浏览器上运行的自定义javascript对象。

我通过IScriptControl.GetScriptDescriptors()传递了许多属性,它们都工作得很好,只有一个例外。

这是一个从System.Collections.Generic.Dictionary<>派生的类。即使这样,只要集合中的元素是标量-整型、双精度型和字符串,我就可以使用它。但是当我试图传递一个类的成员时,它在javascript中显示为null对象。有问题的类被标记为Serializable。我将其更改为结构,并获得相同的行为。

看起来IScriptControl中使用的序列化程序进行了浅层复制。我需要一份很深的副本。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-25 10:40:24

好吧,没人回答这个问题。这真的不是一个答案,但是评论字段有点小。

我编写了一个愚蠢的小例子,至少看起来是可行的。我错过了什么,我没有做什么,你是什么?

它会导致将以下内容输出到页面:

代码语言:javascript
复制
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();

这是它的来源:

代码语言:javascript
复制
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

    }
}
票数 1
EN

Stack Overflow用户

发布于 2010-03-25 12:07:26

我建议使用第三方JSON库。从here中有几个可供选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2512142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档