【问题标题】:How to pass complex objects via SignalR?如何通过 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。我的问题:

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

【问题讨论】:

  • 它将被序列化并转换为 JSON 对象,就像您在操作中使用 JsonResult 一样。
  • 别忘了让你的课程公开!!

标签: c# javascript json signalr


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

【讨论】:

  • 我刚刚将我的有效负载从 更改为(简单)复杂类型,它不再起作用,集线器中的发送方法不像以前那样被调用。没有错误,什么都没有。你有什么想法?公共异步任务 SendCommonMessage(CommonMessage commonMessage)
【解决方案2】:

您可能希望将您的类序列化为 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中的对象。它已经在信号器库中实现了
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多