如何通过SignalR传递复杂对象?

Ang*_*ker 19 javascript c# json signalr

SignalR上有一个很好的教程,解释了如何将.NET对象作为参数传递给Javascript,反之亦然.在这种情况下,它传递一个ChatMessage对象.

但是,该教程解决了一个非常简单的对象.我想看看如何在Javascript中处理复杂的.NET对象(其他对象作为属性).

例如,请考虑以下对象:

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;}
}
Run Code Online (Sandbox Code Playgroud)

在.NET中,我可以引用这样的值:master.QuarterHours[2].Minute.Registered.我的问题:

  1. 如何master.QuarterHours[2].Minute.Registered在Javascript端接收方法中引用?
  2. 如何Master在Javascript中构建对象以发送到.NET端?

N. *_*len 22

  1. 你只需发送它并以同样的方式引用它.
  2. 你会通过(这是从服务器获取它时的样子):
{
    QuarterHours: [{
        Minute: {
            Registered: true,
            NumAttendees: 1337
        },
        HourStart: 1
    }],
    Books: ["Game of Thrones", "Harry Potter"],
    EndDay: 2,
    StartDay: 3
}
Run Code Online (Sandbox Code Playgroud)


Sea*_*ice 8

您可能希望将类序列化为JSON对象.有很多方法可以实现这一点,但您可以尝试使用JSON.NET快速轻松地完成此任务.

如果它尚未包含在您的项目中,您可以通过Nuget添加:

Install-Package Newtonsoft.Json 
Run Code Online (Sandbox Code Playgroud)

代码看起来像:

var json = JsonConvert.SerializeObject(master);
Run Code Online (Sandbox Code Playgroud)

一旦将其传递给客户端,您就可以像对待任何其他对象一样从JSON对象中读取.您可以使用以下javascript代码将SignalR字符串消息转换为JSON对象:

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

您还可以通过SignalR将其传递给服务器,并使用JsonConvert.DeserializeObject反序列化JSON对象,以便将其转换为C#类.查看此处的文档以获取更多详细信息:http://james.newtonking.com/projects/json/help/

  • ...一个解决方案是将对象序列化为JSON. (16认同)
  • 如果有一种本地方式发送复杂的对象(如另一个答案中所述),使用序列化并不是一个"好"的解决方案,而是一种解决方法 - 特别是因为序列化似乎是SignalR在内部所做的..所以基本上你正在改写图书馆的一部分. (3认同)
  • 您不需要手动序列化 signalR 中的对象。它已经在 signalr lib 中实现 (2认同)