1

我对我的所有 $.ajax.post 操作都使用了一种通用方法,并且每次使用它都会对有效负载进行不同的编码。

例如,如果

data: someJSObject

它以 JSON 格式发布。

但是,如果我定义对象(我也尝试将属性放在“引号”中:val)

data: { mgrID: 0, strId: 0, strName: 'Bowie' }

这将转换为 url 编码的字符串

mgrID=250411&strId=1006575&strName=Bowie

我的帖子功能

$.ajax({
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        url: url,
        data: data,

在 chrome 控制台中,我可以在发布前看到该对象被识别为有效的 json。

4

4 回答 4

4

您混淆了 javascript 对象和 json。如果要发送json,则必须给 jquery json

data: { mgrID: 0, strId: 0, strName: 'Bowie' }不是json。

这是json:

data: '{ "mgrID": 0, "strId": 0, "strName": "Bowie" }'

请注意我现在如何将字符串分配给数据而不是对象。

您可以使用将对象转换为 jsonJSON.stringify(theobject)

data: JSON.stringify({ mgrID: 0, strId: 0, strName: 'Bowie' })
于 2013-10-31T18:02:30.063 回答
1

尝试像这样对其进行字符串化:

 data: JSON.stringify(data)
于 2013-10-31T17:40:22.057 回答
1

查看您以前的帖子,我假设您有 ASP.NET / C# 背景,因此有这个答案。

在 ASP.NET 中,我们有一个叫做自动序列化的东西。

假设如果您有这样的课程

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }    
}

你有一个网络服务、控制器或任何有这样的方法的东西

public bool AddPerson(Person person)

您可以将 JavaScript 对象序列化为这样的 json 字符串

var DTO = {
    person: {
        FirstName: "Hugh",
        LastName: "Jackman",
        Age: 10
    }
};
$.ajax({
    type: 'POST',
    contentType: 'application/json',
    dataType: 'json',
    url: url,
    data: JSON.stringify(DTO)
}).done(function () {
    console.log("I passed an object");
});

当您转到服务器端方法AddPerson并在其上放置断点时。然后你会看到json字符串已经被自动反序列化为Person类的对象。

这样,您还可以传递一组人员,您可以将其检索为List<Person>

PS:JSON.stringify 存在于所有现代浏览器中。对于较旧的,请使用此后备

更新:如果服务器端方法接受这样的三个参数

public bool AddPerson(string firstName, string lastName, int age)

然后像这样更改您的DTO

var DTO = {
    firstName: "Hugh",
    lastName: "Jackman",
    age: 10
};

并使用相同的 AJAX 调用。

如果您有时间,请阅读此内容。使用复杂类型使调用服务不那么复杂……

于 2013-10-31T18:03:04.070 回答
-3

发布“作为json”尝试

data: (tempobj={my: "data",is: "json"})

或者

data: {mypost:{my: "data",is: "json"} }

在第二种情况下,您可以在服务器代码中查找 mypost var。

于 2013-10-31T17:34:40.497 回答