Frage

Ich spiele um mit einer asp.net Seite, die die IScriptControl Schnittstelle ist unter Verwendung von Daten, um von dem Code-behind zu dem Objekt benutzerdefinierte Javascript im Browser ausgeführt wird.

Ich bin eine Reihe von Eigenschaften über IScriptControl.GetScriptDescriptors vorbei () und sie sind alle gut funktioniert, bis auf einen.

Das ist eine Klasse, die von System.Collections.Generic.Dictionary <>. Und auch, dass für mich gearbeitet hat, so lange, wie die Elemente in der Sammlung Skalare waren - ints, Doppel- und Streicher. Aber als ich versuchte, ein Mitglied einer Klasse übergibt, zeigte, dass es in der JavaScript als ein Null-Objekt auf. Die betreffende Klasse markiert [Serializable]. Habe ich es auf eine Struktur, und bekam das gleiche Verhalten.

Es sieht aus, als ob der Serializer verwendet in IScriptControl hat eine flache Kopie. Ich brauche eine tiefe Kopie.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Nun, sonst niemand antwortet diese. Das ist wirklich nicht eine Antwort, aber das Kommentarfeld ist ein wenig klein.

I codierte ein dummes kleines Beispiel auf, die zumindest Aussehen wie es funktioniert. Was bin ich, was bin ich nicht zu tun, dass du bist?

Es bewirkt, dass dieser Ausgang auf der Seite sein:

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();

Und hier ist die Quelle:

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

    }
}

Andere Tipps

Ich würde vorschlagen, eine 3rd-Party-JSON-Bibliothek. Es gibt mehr von wählen hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top