代码之家  ›  专栏  ›  技术社区  ›  Rubens Farias

Silverlight事件参数上的JSON字符串化错误

  •  0
  • Rubens Farias  · 技术社区  · 16 年前

    我有以下Silverlight代码:

    [ScriptableType]
    public partial class Page : UserControl
    {
        [ScriptableMember]
        public event EventHandler<UploadChangedEventArgs> OnFileProgressChanged;
    
        private void FileProgressChanged_Click(object sender,RoutedEventArgs e)
        {   // test reasons only
            OnFileProgressChanged(null, new UploadChangedEventArgs()
            {
                Id = Guid.NewGuid(),
                Sent = 12345,
                Started = DateTime.Now
            });
        }
    }
    

    事件参数具有以下结构:

    [ScriptableType]
    public class UploadChangedEventArgs : EventArgs
    {
        public Guid Id { get; set; }
        public long Sent { get; set; }
        public DateTime Started { get; set; }
    }
    

    在javascript方面,我编写了事件回调(它会被激发):

    function onFileUploadProgressChanged(sender, e) {
        alert(JSON.stringify(e)); // shows "{}"
        alert(e.Sent);            // shows "12345"
    }
    

    我需要对数据进行字符串化,以便通过回发事件发送它。发生了什么?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Michael S. Scherotter    16 年前

    查看代码,您可能需要显式获取属性(id、sent、started),并自己构建JSON字符串。

    function onFileUploadProgressChanged(sender, e) 
    {    
        var json = "{\""Id\":\"" + e.Id + 
            "\", Sent:" + e.Sent + 
            ", \"Started\":\" + e.Started + "\"}";
    }
    

    或者,可以向uploadChangedEventargs添加属性以获取JSON(使用Silverlight的JSONObject类或实现uploadChangedEventargs.ToString()方法以返回JSON属性:

    using System.Json;
    
    class UploadChangedEventArgs : EventArgs
    {
       public string JSON
       {
           get
           {
                var json = new JsonObject();
    
                json.Add("Id", this.Id);
                json.Add("Sent", this.Sent);
                json.Add("Started", this.Started);
    
                return json.ToString();
           }
       }
    }
    
        2
  •  0
  •   Rubens Farias    16 年前

    我以下面的代码结束;它类似于michael代码,但它更安全,因为它不需要处理字符转义序列。

    function onFileListChanged(sender, e) {
      var files = [];
      for (var i = 0; i < e.Files.length; i++) {
          files[i] = {
               Id    : e.Files[i].Id, 
               Name  : e.Files[i].Name,
               Size  : e.Files[i].Size
          };
      }
      __doPostBack(
            "<%= RadGrid1.UniqueID %>", 
            "OnFileListChanged:" + JSON.stringify(files));
      }