【问题标题】:Passing complex objects to javascript via IScriptControl通过 IScriptControl 将复杂对象传递给 javascript
【发布时间】:2011-01-31 12:18:52
【问题描述】:

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

我通过 IScriptControl.GetScriptDescriptors() 传递了许多属性,它们都工作正常,除了一个。

那是一个派生自 System.Collections.Generic.Dictionary 的类。只要集合中的元素是标量——整数、双精度数和字符串,即使那个也一直在为我工作。但是当我试图传递一个类的成员时,它在 javascript 中显示为一个空对象。有问题的类被标记为 [Serializable]。我将其更改为结构,并得到相同的行为。

看起来 IScriptControl 中使用的序列化程序执行了浅拷贝。我需要一份深拷贝。

有什么想法吗?

【问题讨论】:

  • IScriptControl 是接口,你使用什么类来实现它?或者,您对 GetScriptDescriptors() 的定义是什么样的?编辑:没关系,你通过 ScriptControlDescriptor.AddProperty 传递你的对象,对吧?好的。
  • 没错。这就是序列化对象,但只有一层。

标签: asp.net iscriptcontrol


【解决方案1】:

嗯,没有其他人回答这个问题。这确实不是答案,但评论字段有点小。

我编写了一个愚蠢的小例子,至少 看起来 可以正常工作。我错过了什么,我没有做什么?

它会导致输出到页面:

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

    }
}

【讨论】:

  • 感谢您的示例。当我运行它时,我很清楚问题出在哪里 - 只有公共成员和属性被序列化。
【解决方案2】:

我建议使用第 3 方 JSON 库。有多个here可供选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2014-01-06
    • 1970-01-01
    • 2015-07-10
    • 2013-06-25
    相关资源
    最近更新 更多