2009-06-20 7 views
0

Ich habe folgenden Silverlight-Code:JSON stringify Fehler auf Silverlight Ereignisargument

[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 
     }); 
    } 
} 

die Ereignisargumente haben diese Struktur:

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

Auf Javascript Seite, ich den Ereignisrückruf schrieb (und es wird gefeuert):

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

Ich muss diese Daten stringifizieren, um es durch ein Postback-Ereignis zu senden. Was ist los mit dir?

Antwort

0

I ended mit dem folgenden Code, es ist ähnlich wie Michael Code, aber es ist sicherer, weil es nicht mit Zeichen Escape-Sequenzen zu beschäftigen hat

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)); 
    } 
0

Wenn Sie Ihren Code betrachten, müssen Sie wahrscheinlich die Eigenschaften (Id, Sent, Started) explizit abrufen und die JSON-Zeichenfolge selbst erstellen.

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

Alternativ können Sie eine Eigenschaft zu dem UploadChangedEventArgs fügen Sie die JSON zu bekommen (Silverlight JsonObject-Klasse oder die UploadChangedEventArgs.ToString() -Methode implementieren, um die JSON Eigenschaft zurückzukehren:

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(); 
     } 
    } 
} 
+0

Hallo Michael, nette Ideen, aber ich war Klo. König für eine automatische Methode für das Property-Discover, genau wie in JSON.stringify ({Id: e.Id, Name: e.Name}); Ihre erste Probe kann zu Fluchtproblemen führen, aber ich mochte die zweite. –