AJAX调用C#方法未返回数据

3

我正在调用以下C#方法:

[WebMethod(true)]
public static List<ReadUserStructure> LoadFriends()
{        
    List<ReadUserStructure> returner = Friend.ReadAllFriends();        
    return returner;
}

使用以下jQuery代码:
$.ajax({
    type: "POST",
    url: "Main.aspx/LoadFriends",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) { alert(msg.Count.toString()); }
});

我在 C# 方法上设置了断点,并且它被触发了。通过逐步调试这个方法,函数运行正常,在我的用户中创建了一个计数为 2 的列表。但是这个列表没有返回给客户端。有什么想法吗?


1
msg.Count.toString() <- 这看起来像是 C#,但需要使用 Javascript。请将 alert(msg); 的结果添加到你的问题中。 - Dark Falcon
太棒了,它显示了 [object Object]。那么我推测 msg 是列表? - MaxWillmott
John Gibb 的想法有一部分是正确的。在 C# 中,List 将会转换成 Javascript 中的数组。 - Dark Falcon
1
在Chrome中,使用Ctrl-Shift-I(Mac上的Cmd-Opt-I)打开检查器,然后切换到网络选项卡。接着,重新加载页面并触发Ajax调用。您将能够清晰地检查结果并从这里看到正在发生的事情。 - John Gibb
我正在使用普通的for循环遍历数组,并尝试执行以下操作: alert(msg[i].UserName);用户名是ReadUserStructure的一个属性,但是这个循环被跳过了(在firebug中)。 - MaxWillmott
6个回答

2
问题是在JavaScript中,该列表没有Count属性。相反,查找msg.length

1
alert 前面加上一个调试器debugger,在 firebug 或者 IE 或者Visual Studio 中进行调试。检查是否接收到了对象 msg。如果是,则使用 msg.Length 而不是 msg.Count,否则添加错误处理程序,并检查错误。
 success: function (msg) {
     debugger; 
     alert(msg.Length.toString()); 
 },
 error: function (data) {
 }

希望这能有所帮助


0

也许ReadUserStructure不可序列化?

你是否在Chrome Inspector或Firebug中看到了控制台输出,因为这通常有助于解决这些问题。


请问您能解释一下“可序列化”是什么意思吗? - MaxWillmott
维基百科称:“在计算机科学中,在数据存储和传输的上下文中,序列化是将数据结构或对象状态转换为可以存储(例如在文件或内存缓冲区中)或通过网络连接链路传输并在同一台或另一台计算机环境中稍后“复活”的格式。”但在这种情况下,它意味着可以作为JSON进行传输。 - Andy Stannard
1
我会创建一个Viewmodel(一个简单的类,其中包含视图所需的所有数据属性),并使用类似AutoMapper的工具将其填充到ReadUserStructure中。首先,也许可以创建ViewModel,创建一些实例并用测试数据填充它们,然后将它们放入列表中。然后从WebMethod发送它们,以查看是否存在问题。 - Andy Stannard

0

ReadUserStructure可序列化吗?

尝试使用您知道应该有效的对象列表,例如整数或字符串。


0

如果我没错的话,如果你要返回 JSON 结果,你需要说明你正在返回一个 JSON,语法不确定,但服务器应该指定我正在返回一个 JSON 结果。


0

所有提到序列化的人都知道这是个问题。现在我正在使用asp.net Ajax扩展,非常适合我想做的事情。

感谢大家的时间和努力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接