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

时间:2013-06-27 18:25:47

标签: c# javascript 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;}
}

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

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

2 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:8)

您希望将类序列化为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/