SignalR,将对象从 HUB 传递到客户端(MVC C#)

Jay*_*Jay 2 javascript c# asp.net-mvc json signalr

我环顾了其他问题,但他们似乎没有完全回答这个问题,我正在尝试通过 JSON 将对象传递给客户端 Javascript。我正在使用 Newtonsoft.Json 来简化这个过程,但我似乎无法收到该对象。

这是代码:

建立连接后,我在客户端 javascript 中使用 start().done() 调用集线器:

   //start comm with server
$.connection.hub.start().done(function () {
    console.log('Grabbing playlist data');
    Playlist.server.requestPlaylist();
});
Run Code Online (Sandbox Code Playgroud)

这将调用以下方法,该方法应该抓取对象并将其传回:

    public void requestPlaylist()
   {
       var playlistData = (from c in db.Playlist where c.ID > 0 select c).Include(h => h.Song).ToList();
       Playlist player = new Playlist();

       foreach (var item in playlistData)
       {
           player.ID = item.ID;
           player.Profile = item.Profile;
           player.Song.ID = item.Song.ID;
           player.Song.name = item.Song.name;
           player.upvotes = item.upvotes;
       }

       string jsonObject = JsonConvert.SerializeObject(player);


       Clients.All.recievePlaylist(jsonObject);
   }
Run Code Online (Sandbox Code Playgroud)

所以在这里,我正在搜索数据库,获取结果并将其存储到播放列表模型中,然后使用 newtonsoft.json 将模型转换为 json 对象(其原理与他们网站上的示例大致相同)。

从中调用的客户端javascript是:

function recievePlaylist(jsonObject) {
    console.log('test to recieve data: ' + jsonObject.ID + ' test.');

};
Run Code Online (Sandbox Code Playgroud)

现在只是为了测试目的,我只是退出到控制台,但是这没有任何回报:

“测试接收数据:测试。” 是它回来的方式。

我错过了什么?

rda*_*ans 6

因为您在将对象传递给客户端之前在服务器上将其转换为字符串,所以客户端会收到一个字符串。json 对象的字符串表示没有 ID 属性,因此该值将为“未定义”。

在客户端,您可以使用它来将字符串转换为 json 对象:

jsonObject = JSON.parse(jsonObject);
Run Code Online (Sandbox Code Playgroud)

只需将该行添加到 recievePlaylist 函数的顶部即可。

注意:您实际上不需要将服务器对象转换为服务器端的 json 字符串。SignalR 会自动将您的服务器端对象转换为客户端上的 json 对象。