Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ASP.net AJAX调用返回JSON的页面_.net_Asp.net_Asp.net Ajax - Fatal编程技术网

使用ASP.net AJAX调用返回JSON的页面

使用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。本质上它是一个.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函数。申请表格是