C# 如何通过信号器传递复杂对象?

C# 如何通过信号器传递复杂对象?,c#,javascript,json,signalr,C#,Javascript,Json,Signalr,有一个很好的教程解释了如何将.NET对象作为参数传递给Javascript,反之亦然。在这种情况下,它将一个ChatMessage对象传入和传出 但是,本教程介绍了一个非常简单的对象。我想看看如何在Javascript中处理复杂的.NET对象(将其他对象作为属性) 例如,考虑以下对象: class Master { public List<QuarterHour> QuarterHours { get; set; } public List<string>

有一个很好的教程解释了如何将.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;}
}
类主控{
公共列表{get;set;}
公共列表书籍{get;set;}
public int EndDay{get;set;}
公共int开始日期{get;set;}
}
每四分之一小时上课{
公共分钟持续分钟{get;set;}
公共整数小时开始{get;set;}
}
类分钟持续时间{
公共bool注册{get;set;}
公共整数NumAttendees{get;set;}
}
在.NET中,我可以引用如下值:
master.QuarterHours[2].Minute.Registered
。我的问题是:

  • 如何在Javascript端的接收方方法中引用
    master.QuarterHours[2].Minute.Registered
  • 如何在Javascript中构建
    Master
    对象以发送到.NET端
  • 您只需发送它并以相同的方式引用它
  • 您将通过(这是从服务器获取时的外观):

  • 您可能希望将类序列化为JSON对象。有很多方法可以做到这一点,但是你可以尝试快速简单地做到

    如果尚未包含在项目中,则可以通过Nuget通过以下方式添加:

    Install-Package Newtonsoft.Json 
    
    代码将类似于:

    var json = JsonConvert.SerializeObject(master);
    
    一旦将其传递到客户端,您就可以像读取其他对象一样读取JSON对象。您可以使用以下javascript代码将信号器字符串消息转换为JSON对象:

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

    您还可以通过signar将此消息传递给服务器,并使用JsonConvert.DeserializeObject反序列化JSON对象,以便将其转换为C#类。查看此处的文档了解更多详细信息:

    它将被序列化并转换为JSON对象,就像您将从操作中使用
    JsonResult
    一样。另外,不要忘记将类公开!!问题在于如何将复杂对象传递给singalR,而不是如何序列化对象……一种解决方案是将对象序列化为JSON。如果有一种本地方式发送复杂对象(如另一个答案所述),那么使用序列化并不是一个真正的“好”解决方案,但是一个解决方法——特别是因为似乎序列化是Signal内部所做的。。所以基本上你是在重写库的一部分,我只是用信号器发送了一个.NET对象。客户端js接收相同结构中的js对象。我根本不需要序列化它。确保这些属性是公共的!您不需要在信号器中手动序列化对象。它已经在signarlibi中实现,只是将我的有效负载从一个(简单的)复杂类型更改为一个(简单的)复杂类型,它不再工作,hub中的Send方法不再像以前那样被调用。没有错误,什么都没有。你有什么想法吗?公共异步任务SendCommonMessage(CommonMessage CommonMessage)
    var master = JSON.stringify(eval("(" + message + ")"));
    var registered = master.QuarterHours[2].Minute.Registered;