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

Getting JSON Object Result from $.post()

本文关键字:JSON 对象 结果 获取 post      更新时间:2023-09-26

我正在尝试通过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 方法按预期调用,并带有预期的参数。但是,传递给我的成功函数的参数($.post() 的最后一个参数)是文档类型,不包含我期望的成功和消息成员。

什么是

神奇的词,这样我才能拿回我期待的对象?

编辑

仔细检查,我可以找到我正在寻找的数据,如下所示:

result.childNodes[0].childNodes[0].data: "{"成功":true,"消息":"服务器已成功更新!"}"

您看到以 JSON 结尾的节点的奇怪结构的原因是,您没有调用该服务来将 JSON 从 ASMX 脚本服务中引出,然后返回 JSON 字符串。因此,最终结果是返回一个包含该 JSON 字符串的单个值的 XML 文档。

现在遇到的两个特定问题是,您正在手动对返回值进行 JSON 序列化,并且您没有使用 application/json 的内容类型调用服务(.NET 需要它才能切换到 JSON 序列化响应)。

解决这些问题后,由于数据参数是 URL 编码而不是有效的 JSON 字符串,您还会遇到"无效的 JSON 原语"错误。

要使其正常工作,请在服务器端执行以下操作:

[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 开发人员的通信部分中的帖子。当您继续沿着这条路走下去时,您会发现很多信息很有帮助。

注意:helmus 留下的链接是相关的。在2.0和现在之间,在使用ASMX ScriptServices通过JSON进行通信方面,没有任何根本性的变化。如果你对 .NET 中解决此问题的真正尖端方法感兴趣,ASP.NET Web API 是要走的路。

将此属性添加到 ProcessItem 方法中:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

$.post调用中更明确。

$.ajax({
    type:'post',
    url:'UpdateServer.asmx/ProcessItem',
    data: {'itemId':$(this).text()}
}).done(function (result) {
        alert(result);
});