我正在尝试通过WebForms应用程序中的AJAX调用Web服务。
我的脚本看起来像这样:
$.post('UpdateServer.asmx/ProcessItem',
'itemId=' + $(this).text(),
function (result) {
alert(result);
});
我的网络服务看起来像这样。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class UpdateServer : System.Web.Services.WebService
{
[WebMethod]
public string ProcessItem(int itemId)
{
return new JavaScriptSerializer().Serialize(
new { Success = true, Message = "Here I am!" });
}
}
Web方法按预期调用并带有预期参数。但是,传递给我的success函数的参数($ .post()的最后一个参数)是document类型,不包含我期望的Success和Message成员。
什么是神奇的词语,以便我可以找回我期待的对象?
修改
仔细观察后,我可以找到我正在寻找的数据如下:
result.childNodes [0] .childNodes [0]。数据: “{”成功“:true,”消息“:”服务器已成功更新!“}”
答案 0 :(得分:2)
您看到以JSON结尾的奇怪节点结构的原因是因为您没有调用服务the necessary way to coax JSON out of ASMX ScriptServices然后返回JSON字符串。因此,最终结果是您返回的XML文档包含该JSON字符串的单个值。
您现在遇到的两个具体问题是您是manually JSON serializing your return value并且您没有使用内容类型application/json
调用该服务(.NET需要切换到JSON序列化响应)。
修复这些问题后,您还会遇到“无效的JSON原语”错误due to the data parameter being URL encoded instead of a valid JSON string。
要使其正常工作,请在服务器端执行此操作:
[ScriptService]
public class UpdateServer : System.Web.Services.WebService
{
[WebMethod]
public object ProcessItem(int itemId)
{
return new { Success = true, Message = "Here I am!" };
}
}
如果需要,您还可以创建一个数据传输对象(也称为ViewModel)而不是使用匿名类型和object
。
要成功获取原始JSON,请在客户端执行此操作:
$.ajax({
url: 'UpdateServer.asmx/ProcessItem',
type: 'post',
contentType: 'application/json',
data: '{"itemId":' + $(this).text() + '}',
success: function(result) {
// This will be { d: { Success: true, Message: "Here I am!" } }.
console.log(result);
}
});
如果您有几分钟时间,请仔细阅读jQuery for the ASP.NET developer通讯部分中的帖子。当你继续沿着这条道路前进时,你会发现很多信息都很有用。
注意:helmus离开的链接是相关的。在使用ASMX ScriptServices通过JSON进行通信方面,2.0和现在之间没有任何根本性的变化。如果您对.NET中这个问题的真正前沿方法感兴趣,那么ASP.NET Web API就是您的选择。
答案 1 :(得分:0)
将此属性添加到ProcessItem方法:
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
答案 2 :(得分:0)
在$.post
电话中更明确。
$.ajax({
type:'post',
url:'UpdateServer.asmx/ProcessItem',
data: {'itemId':$(this).text()}
}).done(function (result) {
alert(result);
});