【问题标题】:jQuery.ajax "data" parameter syntaxjQuery.ajax“数据”参数语法
【发布时间】:2011-11-07 16:56:06
【问题描述】:

我正在尝试将 javascript 变量的内容传递给服务器进行处理。我可以传递静态字符串没有问题,但是当我传递一个包含字符串的变量时,不会调用 WebMethod。这是我的代码: (客户)

function expand(checkbox) 
{
    var selectedrow = checkbox.parentNode.parentNode;
    var rowindex = selectedrow.rowIndex;
    var parent = document.getElementById("parentTable");
    var NextRow = parent.rows[rowindex + 1];

    var cols = selectedrow.cells[1];
    var ID = cols.firstElementChild.attributes.value;


    $.ajax({
        type: "post",
        url: "Playground.aspx/childBind",
        data: "{sendData: ID}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) { alert("successful!" + result.d); }
    })

    NextRow.style.visibility = "visible";
}

(服务器)

[WebMethod]
    public static string childBind(string sendData)
    {
        return String.Format("Hello");
    }

现在,如果我要尝试 data: "{sendData: "ok"}",WebMethod 会被调用并返回响应。我的语法怎么错了?

【问题讨论】:

标签: c# javascript jquery asp.net ajax


【解决方案1】:

您可以使用此代码:

$.ajax({
        type: "post",
        url: "Playground.aspx/childBind",
        data: JSON.stringify({sendData: ID}),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) { alert("successful!" + result.d); }
    })

【讨论】:

    【解决方案2】:

    您发送的是字符串而不是对象("{sendData: ID}" 而不是 {sendData: ID})。而且您发送的数据不是 JSON。所以删除 contentType 行并更改数据行。您应该将其重写为:

    $.ajax({
        type: "post",
        url: "Playground.aspx/childBind",
        data: {sendData: ID},
        dataType: "json",
        success: function (result) { alert("successful!" + result.d); }
    })
    

    如果你想发送 JSON,你也可以这样写:

    $.ajax({
        type: "post",
        url: "Playground.aspx/childBind",
        data: $.getJSON({sendData: ID}),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (result) { alert("successful!" + result.d); }
    })
    

    【讨论】:

    • 现在似乎正确的数据已经到位,但仍然没有调用服务器端 Web 方法。我注意到如果我注释掉“contentType”和“dataType”行,客户端的“成功”语句就会被调用。 “ID”包含来自隐藏字段的字符串值,该值实际上是一个 GUID(但在存储时是一个字符串。)服务器端 Web 方法需要一个字符串。
    • 您应该删除 contentType 行,因为您没有将数据作为 json 发送(您只是将数据作为 json 接收)或者您可以在数据周围添加 jQuery.getJSON()
    【解决方案3】:

    您将“ID”作为字符串而不是变量传递。 您需要做的就是删除数据对象周围的引号。

    进一步阅读 JSON 和 javascript 对象:

    http://www.json.org/

    http://www.w3schools.com/js/js_objects.asp

    【讨论】:

    • 现在似乎正确的数据已经到位,但仍然没有调用服务器端 Web 方法。我注意到如果我注释掉“contentType”和“dataType”行,客户端的“成功”语句就会被调用。 “ID”包含来自隐藏字段的字符串值,该值实际上是一个 GUID(但在存储时是一个字符串。)服务器端 Web 方法需要一个字符串。
    【解决方案4】:

    由于您使用的是 jQuery,因此请运行以下测试以获得答案:

    var ID = 45;
    
    var x = "{sendData: ID}";
    
    alert(jQuery.isPlainObject(x));  // false
    
    var y = { sendData: ID};
    
    alert(jQuery.isPlainObject(y)); // true
    

    这里是 jsFiddle:

    http://jsfiddle.net/3ugKE/

    【讨论】:

      【解决方案5】:

      您不必将其作为字符串传递。由于ID 是一个javascript 变量,您必须传递它的值。当您以"{sendData: ID}" 传递数据时,它不会传递ID 的值。

      试试这个

      data: { sendData: ID }
      

      【讨论】:

      • @Seraph812 - 希望这对您有所帮助。
      • 这似乎不起作用,尽管它确实让我在其他地方发现了错误。在 javascript 中进行小修改后,我现在存储了正确的值。 var ID = cols.firstElementChild.defaultValue;但是,仍然没有调用服务器端 Web 方法。我注意到如果我注释掉“contentType”和“dataType”行,客户端的“成功”语句就会被调用。 “ID”包含来自隐藏字段的字符串值,该值实际上是一个 GUID(但在存储时是一个字符串。)服务器端 Web 方法需要一个字符串。
      • 你做了什么修改?你的意思是你仍在传递`数据:“{sendData:ID}”`并且它有效?
      • 没有。我修复了 AND var ID = cols.firstElementChild.defaultValue;还是不行。
      • 我的解决方案对您有任何帮助吗?如果是,那么我认为您应该将此标记为答案。如果您有不同的问题,那么您应该创建另一个问题。
      猜你喜欢
      • 1970-01-01
      • 2019-11-19
      • 2011-06-10
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      相关资源
      最近更新 更多