2010-03-24 4 views
2

Я играю с страницей asp.net, использующей интерфейс IScriptControl для передачи данных из кода в пользовательский объект javascript, работающий в браузере.Передача сложных объектов в javascript через IScriptControl

Я передаю несколько свойств через IScriptControl.GetScriptDescriptors(), и все они работают нормально, за исключением одного.

Этот класс является производным от System.Collections.Generic.Dictionary <>. И даже тот, кто работал для меня, пока элементы в коллекции были скалярами - ints, doubles и strings. Но когда я попытался передать член класса, он появился как нулевой объект в javascript. Класс, о котором идет речь, отмечен [Serializable]. Я изменил его на структуру и получил то же поведение.

Похоже, что сериализатор, используемый в IScriptControl, выполняет мелкую копию. Мне нужна глубокая копия.

Любые идеи?

+0

IScriptControl - это интерфейс, какой класс вы используете, который это реализует? Или, как выглядит ваше определение GetScriptDescriptors()? EDIT: неважно, вы передаете свои объекты через ScriptControlDescriptor.AddProperty, правильно? ОК. –

+0

Точно. И это сериализует объект, но только на один уровень. –

ответ

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 

    } 
} 
+0

Спасибо за пример. Когда я запустил его, мне стало ясно, в чем проблема - только публичные члены и свойства были сериализованы. –

0

Я предложил бы использовать третью партию JSON библиотеку. Есть несколько на выбор от here.

Смежные вопросы