Pregunta

Estoy jugando un poco con una página asp.net que está utilizando la interfaz IScriptControl para pasar datos desde el código subyacente al objeto JavaScript personalizada que se ejecuta en el navegador.

Estoy pasando una serie de propiedades a través de IScriptControl.GetScriptDescriptors (), y todos están trabajando muy bien, a excepción de uno.

Que uno es una clase derivada de System.Collections.Generic.Dictionary <>. E incluso que uno ha estado trabajando para mí, siempre y cuando los elementos de la colección eran escalares - enteros, dobles, y cuerdas. Pero cuando traté de pasar a un miembro de una clase, que apareció como un objeto nulo en el javascript. La clase en cuestión está marcada [Serializable]. He cambiado a una estructura, y obtuve el mismo comportamiento.

Parece como si el serializador utilizado en IScriptControl hace una copia superficial. Necesito una copia profunda.

¿Alguna idea?

¿Fue útil?

Solución

Bueno, nadie está respondiendo a esto. Esto realmente no es una respuesta, pero el campo de comentario es un poco pequeña.

codifiqué un poco estúpida ejemplo, que al menos miradas como funciona. ¿Qué me falta, lo que no estoy haciendo que son?

Esto causa que se trata de la producción de la página:

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

Y aquí está la fuente:

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

    }
}

Otros consejos

Se recomienda usar una tercera biblioteca JSON partido. Hay varios para elegir aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top