我已经查看了其他问题,但他们似乎没有完全回答这个问题,我试图通过JSON将对象传递给客户端Javascript。我使用Newtonsoft.Json来简化这个过程,但我似乎无法接收到这个对象。
以下是代码:
建立连接后,我使用客户端javascript中的start()。done()调用Hub:
//start comm with server
$.connection.hub.start().done(function () {
console.log('Grabbing playlist data');
Playlist.server.requestPlaylist();
});
这会调用以下方法,该方法应该抓取对象并将其传回:
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);
}
所以,在这里,我搜索数据库,获取结果并将其存储到播放列表模型中,然后使用newtonsoft.json将模型转换为json对象(它与示例的原理大致相同)在他们的网站上。)
从中调用的客户端javascript是:
function recievePlaylist(jsonObject) {
console.log('test to recieve data: ' + jsonObject.ID + ' test.');
};
现在只是出于测试目的,我只是退出到控制台,但这没有回来:
"测试收到数据:测试。"它是如何回来的。
我错过了什么?
答案 0 :(得分:4)
因为在将对象传递给客户端之前将对象转换为服务器上的字符串,所以客户端会收到一个字符串。您对json对象的字符串表示形式没有ID属性,因此该值将为" undefined"。
在客户端上,您可以使用它将字符串转换为json对象:
jsonObject = JSON.parse(jsonObject);
只需将该行添加到recievePlaylist函数的顶部即可。
注意:您实际上不需要将服务器对象转换为服务器端的json字符串。 SignalR自动将服务器端对象转换为客户端上的json对象。
答案 1 :(得分:0)
如果您调用 WebAPI 并在客户端 (JavaScript/jQuery) 接收 json 响应/结果。在解析 jsone 响应并将其用作对象方面,这种方式对于 SignalR 或 WebAPI 都是通用的。
var obj = jQuery.parseJSON( '{ "name": "John" }' );
alert( obj.name === "John" );