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

时间:2010-02-09 01:44:15

标签: .net asp.net asp.net-ajax

我有一个需要POST请求并返回一些JSON的页面。基本上它是一个.ashx页面,但这并不重要。

使用jQuery时,我会使用带有“json”的jQuery.Post作为dataType来简单地发出POST请求并获取一个对象。但是,对于当前项目,我主要使用ASP.net AJAX,我不想仅为调用添加jQuery。

对于ASP.net AJAX,我只找到了有关如何调用“传统”Web服务的信息,这意味着将asp:ServiceReference添加到ScriptManager并在最后使用“真正的”Web服务。

是否有更简单的方法对页面进行POST调用?我可以忍受获取原始JSON,然后手动eval(),但我不想创建一个完整的asmx Web服务(在SharePoint上部署它们有点痛苦,我的ashx处理程序工作正常)

3 个答案:

答案 0 :(得分:2)

Sys.Net.WebServiceProxy.invoke(url,methodName,useGet,parametersDictionary,onSuccess,onFailure,userContext,timeout);

除第一个之外,所有参数都是可选的。

parametersDictionary就像{foo:bar} - 如果要发布,参数将作为JSON发送到正文中,如果是GET则作为查询字符串的参数发送(每个参数单独json序列化 - 哪个btw意味着字符串看起来像“foo”,带引号)。

onSuccess,如果回调将数据作为第一个参数(已经反序列化的对象)。

onFailure获取一个错误对象作为第一个参数,其中包含get_message()方法以获取错误消息,以及其他一些内容。

答案 1 :(得分:1)

您可以直接使用invoke类的Sys.Net.WebServiceProxy方法。

方法签名如下所示:

invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout);

假设您的服务实际返回JSON,那么 succeededCallback 的第一个参数应该是JSON对象。

答案 2 :(得分:0)

Sys.Net.WebServiceProxy没有帮助,因为它似乎期望最终真正的Web服务 - Request.Form在服务器端是空的,parametersDictionary似乎被忽略。似乎没有覆盖来连接另一个执行者。

我现在通过手动创建Sys.Net.WebRequest来解决它。我将看看jQuery源代码,因为这种方法更加复杂/“裸机”,但如上所述,如果不需要,我不想在jQuery上添加依赖项。 / p>

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);
    }
}