Как передать сложные объекты через 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/