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

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

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

例如,请考虑以下对象:

 class Master { public List QuarterHours { get; set; } public List 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 。 我的问题:

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

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

您可能希望将类序列化为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将其传递给服务器,并使用JsonConvert.DeserializeObject反序列化JSON对象,以便将其转换为您的C#类。 查看此处的文档以获取更多详细信息: http : //james.newtonking.com/projects/json/help/