从$ .post()获取JSON对象结果

时间:2012-04-15 21:06:07

标签: javascript jquery web-services webforms

我正在尝试通过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,”消息“:”服务器已成功更新!“}”

3 个答案:

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