Как передать сложные объекты через SignalR?
Существует отличный учебник по SignalR, что объясняет, как передать объекты .NET в качестве параметров Javascript и наоборот. В этом случае он передает объект ChatMessage
в и из.
Однако в учебнике рассматривается действительно простой объект. Я хотел бы посмотреть, как работать со сложными объектами .NET(которые имеют другие объекты как свойства) в Javascript.
Например, рассмотрим следующий объект:
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;}
}
В .NET я могу ссылаться на такое значение: master.QuarterHours[2].Minute.Registered
. Мои вопросы:
- Как мне сделать ссылку
master.QuarterHours[2].Minute.Registered
в методе приемника на конце Javascript?
- Как мне создать объект
Master
в Javascript для отправки в конец .NET?
Ответы
Ответ 1
- Вы просто отправляете его и ссылаетесь на него так же.
- Вы пройдете (это будет выглядеть, когда вы получите его с сервера):
{
QuarterHours: [{
Minute: {
Registered: true,
NumAttendees: 1337
},
HourStart: 1
}],
Books: ["Game of Thrones", "Harry Potter"],
EndDay: 2,
StartDay: 3
}
Ответ 2
Вы хотели бы сериализовать свой класс в объект JSON. Есть много способов сделать это, но вы можете попробовать JSON.NET сделать это быстро и просто.
Если он еще не включен в ваш проект, вы можете добавить его через Nuget с помощью:
Install-Package Newtonsoft.Json
Код выглядит примерно так:
var json = JsonConvert.SerializeObject(master);
Как только это будет передано на вашу клиентскую сторону, вы сможете читать с вашего объекта JSON, как и любой другой. Вы можете использовать следующий код javascript для преобразования строкового сообщения SignalR в объект JSON:
var master = JSON.stringify(eval("(" + message + ")"));
var registered = master.QuarterHours[2].Minute.Registered;
Вы также можете передать это через SignalR на сервер и десериализовать объект JSON с помощью JsonConvert.DeserializeObject, чтобы преобразовать его в классы С#. Подробнее читайте здесь: http://james.newtonking.com/projects/json/help/