web-dev-qa-db-fra.com

Comment passer des objets complexes via SignalR?

Il existe un excellent tutoriel sur SignalR qui explique comment passer des objets .NET en tant que paramètres à Javascript et vice versa. Dans ce cas, il passe un objet ChatMessage vers et depuis.

Cependant, le didacticiel traite d'un objet vraiment simple. J'aimerais voir comment gérer des objets .NET complexes (qui ont d'autres objets comme propriétés) en Javascript.

Par exemple, considérez l'objet suivant:

class Master {
    public List<QuarterHour> QuarterHours { get; set; }
    public List<string> Books { get; set; }
    public int EndDay { get; set; }
    public int StartDay { get; set; }
}

class QuarterHour {
    public MinuteInstance Minute {get; set;}
    public int HourStart { get; set;}
}

class MinuteInstance { 
    public bool Registered {get; set;}
    public int NumAttendees {get; set;}
}

Dans .NET, je peux référencer une valeur comme celle-ci: master.QuarterHours[2].Minute.Registered. Mes questions:

  1. Comment pourrais-je faire référence master.QuarterHours[2].Minute.Registered dans la méthode du récepteur à l'extrémité Javascript?
  2. Comment puis-je créer l'objet Master en Javascript pour être envoyé à la fin .NET?
21
AngryHacker
  1. Il vous suffit de l'envoyer et de le référencer de la même manière.
  2. Vous passeriez (voici à quoi ça ressemble quand vous l'obtenez du serveur):
{
    QuarterHours: [{
        Minute: {
            Registered: true,
            NumAttendees: 1337
        },
        HourStart: 1
    }],
    Books: ["Game of Thrones", "Harry Potter"],
    EndDay: 2,
    StartDay: 3
}
22
N. Taylor Mullen

Vous souhaitez sérialiser votre classe en un objet JSON. Il existe de nombreuses façons d'y parvenir, mais vous pouvez essayer JSON.NET pour le faire rapidement et facilement.

Si ce n'est pas déjà inclus dans votre projet, vous pouvez l'ajouter via Nuget avec:

Install-Package Newtonsoft.Json 

Le code ressemblerait à quelque chose comme:

var json = JsonConvert.SerializeObject(master);

Une fois que cela est passé à votre côté client, vous pouvez alors lire à partir de votre objet JSON comme n'importe quel autre. Vous pouvez utiliser le code javascript suivant pour convertir votre message de chaîne SignalR en objet JSON:

var master = JSON.stringify(eval("(" + message + ")"));
var registered = master.QuarterHours[2].Minute.Registered;

Vous pouvez également transmettre cela via SignalR au serveur et désérialiser l'objet JSON à l'aide de JsonConvert.DeserializeObject afin de le convertir en vos classes C #. Consultez la documentation ici pour plus de détails: http://james.newtonking.com/projects/json/help/

9
SeanPrice