使用ASP.net AJAX调用返回JSON的页面
我有一个页面需要POST请求并返回一些JSON。本质上它是一个.ashx页面,但这并不重要 使用jQuery时,我会使用jQuery.Post和“json”作为数据类型,以简单地发出Post请求并获取一个对象。然而,对于当前的项目,我主要使用ASP.NETAjax,我不想仅仅为了调用而添加jQuery 对于ASP.NETAjax,我只找到了有关如何调用“传统”web服务的信息,这意味着向ScriptManager添加一个ASP:ServiceReference,并在最后拥有一个“真正的”web服务使用ASP.net AJAX调用返回JSON的页面,.net,asp.net,asp.net-ajax,.net,Asp.net,Asp.net Ajax,我有一个页面需要POST请求并返回一些JSON。本质上它是一个.ashx页面,但这并不重要 使用jQuery时,我会使用jQuery.Post和“json”作为数据类型,以简单地发出Post请求并获取一个对象。然而,对于当前的项目,我主要使用ASP.NETAjax,我不想仅仅为了调用而添加jQuery 对于ASP.NETAjax,我只找到了有关如何调用“传统”web服务的信息,这意味着向ScriptManager添加一个ASP:ServiceReference,并在最后拥有一个“真正的”web服
有没有更简单的方法对页面进行POST调用?我可以接受获取原始JSON,然后手动评估它,但我不想创建完整的asmx web服务(在SharePoint上部署它们有点痛苦,我的ashx处理程序工作得很好)Sys.Net.WebServiceProxy.invoke(url、methodName、useGet、parametersDictionary、onSuccess、onFailure、userContext、timeout) 除第一个参数外,所有参数都是可选的 parametersDictionary类似于{foo:bar}——如果您正在发布,则参数将作为JSON发送到正文中,如果是GET,则作为查询字符串上的参数发送(每个参数单独JSON序列化——顺便说一句,这意味着字符串看起来像“foo”,带引号) onSuccess如果回调将数据作为第一个参数(已反序列化对象),则返回onSuccess
onFailure获取一个错误对象作为第一个参数,该参数包含获取错误消息的get_message()方法以及其他一些内容。Sys.Net.WebServiceProxy.invoke(url、methodName、useGet、parametersDictionary、onSuccess、onFailure、userContext、timeout) 除第一个参数外,所有参数都是可选的 parametersDictionary类似于{foo:bar}——如果您正在发布,则参数将作为JSON发送到正文中,如果是GET,则作为查询字符串上的参数发送(每个参数单独JSON序列化——顺便说一句,这意味着字符串看起来像“foo”,带引号) onSuccess如果回调将数据作为第一个参数(已反序列化对象),则返回onSuccess onFailure获取一个错误对象作为第一个参数,该参数包含获取错误消息的get_message()方法以及其他一些内容。您可以直接使用该类的方法 方法签名如下所示:
invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout);
假设您的服务实际返回JSON,那么SucceedCallback的第一个参数应该是JSON对象。您可以直接使用该类的方法
方法签名如下所示:
invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout);
假设您的服务实际返回JSON,那么SucceedCallback的第一个参数应该是JSON对象。没有帮助,因为它似乎期望在最终请求时有一个真正的web服务。服务器端的表单为空,parametersDictionary似乎被忽略。此外,似乎也没有覆盖到另一个执行者
我现在通过手动创建一个。我将看一看jQuery的源代码,因为这种方法要复杂得多/“裸机”,但正如前面所说的,如果不需要,我不想添加对jQuery的依赖
var ApplicationFunctions = {
showDialog: function(someParam, someOtherParam) {
var sb = new Sys.StringBuilder("Do you really want to do '");
sb.append(someParam);
sb.append("' ?");
var msg = sb.toString();
if (confirm(msg)) {
var myWebRequest = new Sys.Net.WebRequest();
myWebRequest.set_url('SomeService.ashx');
myWebRequest.set_httpVerb('POST');
// Manually build POST body. This would need escaping/urlencoding
// I think if I couldn't guarantee that the parameters are 'clean'
var bodySb = new Sys.StringBuilder("postParam=");
bodySb.append(someParam);
bodySb.append("&anotherPostParam=");
bodySb.append(someOtherParam);
var body = bodySb.toString();
myWebRequest.set_body(body);
myWebRequest.get_headers()["Content-Length"] = body.length;
// also check out usercontext to pass additional data into the completed function
// http://msdn.microsoft.com/en-us/library/bb397436.aspx
myWebRequest.add_completed(ApplicationFunctions.onCallCompleted);
myWebRequest.set_timeout(10 * 1000); // 10 seconds
myWebRequest.invoke();
}
},
onCallCompleted: function(response) {
if (response.get_timedOut()) {
alert("Timed Out!");
return;
}
if (response.get_statusCode() !== 200) {
alert("Status Code not OK");
return;
}
if (!response.get_responseAvailable()) {
alert("No data available?!");
return;
}
// Better use a JSON parser
// http://www.json.org/js.html
var responseData = eval('(' + response.get_responseData() + ')');
alert("Success: " + responseData.SomeField);
}
}
没有帮助,因为它似乎期望在请求结束时有一个真正的web服务。表单在服务器端是空的,parametersDictionary似乎被忽略了。此外,似乎也没有覆盖到另一个执行者
我现在通过手动创建一个。我将看一看jQuery的源代码,因为这种方法要复杂得多/“裸机”,但正如前面所说的,如果不需要,我不想添加对jQuery的依赖
var ApplicationFunctions = {
showDialog: function(someParam, someOtherParam) {
var sb = new Sys.StringBuilder("Do you really want to do '");
sb.append(someParam);
sb.append("' ?");
var msg = sb.toString();
if (confirm(msg)) {
var myWebRequest = new Sys.Net.WebRequest();
myWebRequest.set_url('SomeService.ashx');
myWebRequest.set_httpVerb('POST');
// Manually build POST body. This would need escaping/urlencoding
// I think if I couldn't guarantee that the parameters are 'clean'
var bodySb = new Sys.StringBuilder("postParam=");
bodySb.append(someParam);
bodySb.append("&anotherPostParam=");
bodySb.append(someOtherParam);
var body = bodySb.toString();
myWebRequest.set_body(body);
myWebRequest.get_headers()["Content-Length"] = body.length;
// also check out usercontext to pass additional data into the completed function
// http://msdn.microsoft.com/en-us/library/bb397436.aspx
myWebRequest.add_completed(ApplicationFunctions.onCallCompleted);
myWebRequest.set_timeout(10 * 1000); // 10 seconds
myWebRequest.invoke();
}
},
onCallCompleted: function(response) {
if (response.get_timedOut()) {
alert("Timed Out!");
return;
}
if (response.get_statusCode() !== 200) {
alert("Status Code not OK");
return;
}
if (!response.get_responseAvailable()) {
alert("No data available?!");
return;
}
// Better use a JSON parser
// http://www.json.org/js.html
var responseData = eval('(' + response.get_responseData() + ')');
alert("Success: " + responseData.SomeField);
}
}
哦,还要注意,根据您使用的是哪个版本的MS AJAX,您的服务可能需要返回封装在“d”中的数据。例如,如果您的服务返回:[1,2,3],那么它应该返回:{“d”:[1,2,3]}这是一个安全措施,我在这里不讨论。如果您使用的是MS AJAX 4(测试版),那么您不需要这个。但你在3.5中做到了。如果您使用JavaScriptSerializer生成JSON,您可以通过将数据放入字典来获得“d”,其中“d”是键,值是您的对象。谢谢,但是WebServiceProxy似乎只适用于Web服务,而不适用于恰好从POST读取内容的简单页面。我不能传入任何变量,因为parametersDictionary似乎期望使用WebService函数。表单为空。它在帖子正文中发送参数,但不作为键/值对发送。这只是文章正文中的JSON。如果您的页面需要的是传统的post,而不是JSON,那么是的,您需要直接使用WebRequest。另外请注意,根据您使用的MS AJAX版本,您的服务可能需要返回包装在“d”中的数据。例如,如果您的服务返回:[1,2,3],那么它应该返回:{“d”:[1,2,3]}这是一个安全措施,我在这里不讨论。如果您使用的是MS AJAX 4(测试版),那么您不需要这个。但你在3.5中做到了。如果您使用JavaScriptSerializer生成JSON,您可以通过将数据放入字典来获得“d”,其中“d”是键,值是您的对象。谢谢,但是WebServiceProxy似乎只适用于Web服务,而不适用于恰好从POST读取内容的简单页面。我不能传入任何变量,因为parametersDictionary似乎期望使用WebService函数。表单为空。它在帖子正文中发送参数,但不作为键/值对发送。这只是文章正文中的JSON。如果你的页面需要的是传统的帖子,而不是JSON,那么是的,你需要直接使用WebRequest。谢谢,但WebServiceProxy似乎只适用于Web服务,而不适用于碰巧从帖子中读取内容的简单页面。我不能传入任何变量,因为parametersDictionary似乎期望使用WebService函数。申请表格是