信号器,将对象从中心传递到客户端(MVC#)
我已经研究了其他问题,但它们似乎没有完全回答这个问题,我正在尝试通过JSON将一个对象传递给客户端Javascript。我使用Newtonsoft.Json来简化这个过程,但我似乎无法接收对象 代码如下: 建立连接后,我使用客户端javascript中的start().done()调用集线器:信号器,将对象从中心传递到客户端(MVC#),c#,javascript,asp.net-mvc,json,signalr,C#,Javascript,Asp.net Mvc,Json,Signalr,我已经研究了其他问题,但它们似乎没有完全回答这个问题,我正在尝试通过JSON将一个对象传递给客户端Javascript。我使用Newtonsoft.Json来简化这个过程,但我似乎无法接收对象 代码如下: 建立连接后,我使用客户端javascript中的start().done()调用集线器: //start comm with server $.connection.hub.start().done(function () { console.log('Grabbing play
//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.');
};
现在,出于测试目的,我只是注销到控制台,但返回时什么也没有:
“接收数据的测试:测试。”这是它返回的方式
我遗漏了什么?因为在将对象传递给客户机之前,您在服务器上将对象转换为字符串,所以客户机会收到一个字符串。json对象的字符串表示形式没有ID属性,因此该值将为“未定义” 在客户端上,您可以使用此命令将字符串转换为json对象:
jsonObject = JSON.parse(jsonObject);
只需将该行添加到ReceivePlaylist函数的顶部即可
注意:实际上不需要在服务器端将服务器对象转换为json字符串。SignalR会在客户端自动将服务器端对象转换为json对象。如果调用WebAPI并在客户端(JavaScript/jQuery)接收json响应/结果。对于signar或WebAPI来说,解析jsone响应和将其用作对象的方法都是通用的
var obj = jQuery.parseJSON( '{ "name": "John" }' );
alert( obj.name === "John" );
您不需要在
receivePlaylist()
中首先eval(jsonObject)
吗?您在receivePlaylist函数中看过jsonObject了吗?它包含任何东西吗?顺便说一句,你的“player”对象在foreach循环中被多次覆盖-你确定这就是你计划的吗?