如何通过 SignalR 传递复杂对象?
Posted
技术标签:
【中文标题】如何通过 SignalR 传递复杂对象?【英文标题】:How to pass complex objects via SignalR? 【发布时间】:2013-06-25 09:26:16 【问题描述】: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
。我的问题:
-
如何在 Javascript 端的接收器方法中引用
master.QuarterHours[2].Minute.Registered
?
如何在 Javascript 中构建 Master
对象以发送到 .NET 端?
【问题讨论】:
它将被序列化并转换为 JSON 对象,就像您在操作中使用JsonResult
一样。
别忘了让你的课程公开!!
【参考方案1】:
-
您只需发送它并以相同的方式引用它。
你会通过(这是从服务器获取它时的样子):
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/
【讨论】:
问题是如何将复杂对象传递给 singalR,而不是如何序列化对象。 ...一种解决方案是将对象序列化为 JSON。 如果有发送复杂对象的本机方式(如其他答案中所述),使用序列化并不是真正的“好”解决方案,而是一种解决方法 - 特别是因为似乎序列化是什么SignalR 在内部做......所以基本上你正在重写库的一部分。 我刚刚使用 SignalR 发送了一个 .NET 对象。客户端js接收一个结构相同的js对象。我根本不需要序列化它。确保属性是公开的! 你不需要手动序列化signalR中的对象。它已经在信号器库中实现了以上是关于如何通过 SignalR 传递复杂对象?的主要内容,如果未能解决你的问题,请参考以下文章