【问题标题】:Post an object as data using Jquery Ajax使用 Jquery Ajax 将对象作为数据发布
【发布时间】:2009-07-01 09:27:26
【问题描述】:

我尝试的代码如下:

var dataO = new Object();
dataO.numberId = 1;
dataO.companyId = 531;

$.ajax({
    type: "POST",
    url: "TelephoneNumbers.aspx/DeleteNumber",
    data: "{numberId:1,companyId:531}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        alert('In Ajax');
    }
});

我想将对象dataO作为ajax数据传递,我该怎么做?

【问题讨论】:

    标签: jquery


    【解决方案1】:

    我将保留我原来的答案,但以下是您需要解决的方法。 (请原谅我已经很久没有使用 jquery 的常规 asp.net/web 服务了:)

    您需要使用以下 js lib json2 库,然后您可以使用 stringify 方法确保您的 json 为服务的正确格式。

    var dataO = {
        numberId: "1", 
        companyId : "531"
    };
    
    var json = JSON2.stringify(dataO); 
    
    $.ajax({
        type: "POST",
        url: "TelephoneNumbers.aspx/DeleteNumber",
        data: json,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            alert('In Ajax');
        }
    });
    

    更新:同样的问题/答案here

    【讨论】:

    • @plattsy param 方法在编写时并不是最好的。在 1.4 中更改
    • 我认为从 2015 年起不再需要使用 JSON2 而不是 JSON(除非需要与旧浏览器兼容)。对吗?
    • 正确的@Janos,除非你的目标是 ie8 等
    【解决方案2】:

    传递给 PHP 的所有数组都必须是对象字面量。下面是一个来自 JS/jQuery 的例子:

    var myarray = {};  //must be declared as an object literal first
    
    myarray[fld1] = val;  // then you can add elements and values
    myarray[fld2] = val;
    myarray[fld3] = Array();  // array assigned to an element must also be declared as object literal
    

    等等...`

    现在可以通过Ajax在data:参数中发送如下:

    data: { new_name: myarray },
    

    PHP 将其拾取并作为普通数组读取,无需任何解码。这是一个例子:

    $array = $_POST['new_name'];  // myarray became new_name (see above)
    $fld1 = array['fld1'];
    $fld2 = array['fld2'];
    etc...
    

    但是,当您通过 Ajax 将数组返回给 jQuery 时,必须首先使用 JSON 对其进行编码。 下面是一个 PHP 示例:

    $return_array = json_encode($return_aray));
    print_r($return_array);
    

    它的输出看起来像这样:

    {
        "fname":"James",
        "lname":"Feducia",
        "vip":"true",
        "owner":"false",
        "cell_phone":"(801) 666-0909",
        "email":"jp@gmail.com", 
        "contact_pk":"",
        "travel_agent":""
    }
    

    {再次我们看到对象文字编码标签}现在可以由 JS/jQuery 将其作为数组读取,而无需在 JS/jQuery 内部进行任何进一步操作...这是 jQuery ajax 中的一个示例:

    success: function(result) {
        console.log(result);
        alert( "Return Values: " + result['fname'] + " " + result['lname'] );
    }
    

    【讨论】:

    • 这也是一篇很老的帖子,但在较新的服务器应用程序中,您不需要 JSON 来发布请求。例如,在 CQmvc (github.com/mohamad-z/CQmvc) 中,可以将 dataO 对象保留为 dataO.numberId:1 和 dataO.companyId:531 并发布数据。在服务器端,你的 Action 的参数应该是 DeleteNumber(ObjectRepresentingYourSpecificType dataO) 就是这样
    • 另外一个用于在描述您的示例时使用简单的英语而不会产生歧义。
    【解决方案3】:

    不需要将数据作为JSON字符串传递,可以直接传递对象,不用定义contentTypedataType,像这样:

    $.ajax({
        type: "POST",
        url: "TelephoneNumbers.aspx/DeleteNumber",
        data: data0,
    
        success: function(data)
        {
            alert('Done');
        }
    });
    

    【讨论】:

    • 非常感谢!节省了我的时间!
    【解决方案4】:

    按原样传递对象。请注意,您可以按如下方式创建对象

    var data0 = {numberId: "1", companyId : "531"};
    
    $.ajax({
     type: "POST",
     url: "TelephoneNumbers.aspx/DeleteNumber",
     data: dataO,
     contentType: "application/json; charset=utf-8",
     dataType: "json",
     success: function(msg) {
     alert('In Ajax');
     }
    });
    

    UPDATE 似乎是序列化程序的一个奇怪问题,也许它需要一个字符串,如果您不感兴趣,可以尝试以下操作。

    数据:“{'numberId':'1', 'companyId':'531'}”,

    【讨论】:

    • 数据是请求看起来像 numberId=1&companyId=531 并且我在 System.Web.Script.Serialization 处得到“Message”:“Invalid JSON primitive:numberId。”,“StackTrace”:”。 JavaScriptObjectDeserializer .DeserializePrimitiveObject()
    • 你能用上面修改过的引号试试吗
    • 你可以试试上面的吗?我知道这不是答案,只是出于兴趣
    • 是的,我确实试过它得到了同样的信息。
    【解决方案5】:

    您可以将对象传递给$.ajax 中的data 选项。 jQuery 会将其作为常规的 post 数据发送,就像普通的 HTML 表单一样。

    $.ajax({
        type: "POST",
        url: "TelephoneNumbers.aspx/DeleteNumber",
        data: dataO, // same as using {numberId: 1, companyId: 531}
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            alert('In Ajax');
        }
    });
    

    【讨论】:

    • 我已经尝试过了,我的 .net webmethod 在反序列化请求时遇到了问题。
    【解决方案6】:

    [object Object] 这意味着对象在某处被转换为字符串。

    转换成字符串:

    //Copy and paste in the browser console to see result
    
    var product = {'name':'test'};
    JSON.stringify(product + ''); 
    

    未转换为字符串:

    //Copy and paste in the browser console to see result
    
    var product = {'name':'test'};
    JSON.stringify(product);
    

    【讨论】:

      猜你喜欢
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2010-12-05
      • 2012-06-22
      • 2014-10-01
      • 1970-01-01
      相关资源
      最近更新 更多