Почему jQuery ajax не сериализует мой объект? - PullRequest
4 голосов
/ 07 февраля 2012

Я использую jQuery 1.7.1.и у меня есть следующий вопрос / проблема:

Код имеет следующий вид:

var accountObject = new Object();
accountObject.account = new Object();
accountObject.account.sas = [];

$.ajax({
    type: "PUT",
    url: "/a/2",
    data: accountObject,
    dataType: "html",
    success: function(msg) {
        alert_user("Successfully saved the selected session attributes as defaults");
    },
    error: function(msg) {
        alert_user(msg);            
    }
});

Проблема заключается в том, что из-за того, что я установил accountObject.account.sas в пустой массив,data приходит на сервер совершенно пустым, как:

{}

, где это должно было быть:

{ "account": { "sas": [] } }

Когда я помещаю некоторые записи в sas свойство account тогда все ок.Например, если я помещаю строки «1», «2» и «3» в качестве массива ["1", "2", "3"], то получаю на сервере:

{ "account": { "sas": [ "1", "2", "3" ] } }

Кто-нибудь знает, почему это так?

Заранее спасибо Панайотис

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Проблема в том, что пустой массив не может быть правильно представлен в строке запроса.Когда вы передаете иерархию объектов в data, jQuery попытается преобразовать ее в строку запроса, но не может понять, что делать с пустым массивом.

Причина, по которой 1.4.4, похоже, возвращала пустую строку всякий раз, когда она проходила по той же иерархии, заключалась в том, что она пыталась передать ключ в строку запроса без значения, результат которого будет выглядеть следующим образом: ...&property=&.По умолчанию это интерпретируется как пустая строка в большинстве серверных сред.

Лично я считаю, что поведение 1.7.1 корректно, поскольку оно заставляет разработчика проверять наличие параметра, а не проверять тип параметра.


Некоторые примечанияо различных вещах, упомянутых здесь

  • traditional: true, совершенно неверно, поскольку он никогда не может обрабатывать иерархии объектов.Вместо этого вы получите: ...&key=[object Object], то есть результат javascript toString() по умолчанию для всех объектов.

  • JSON.stringify, присвоенный data, приведет к тому, что вся вещь будет передана какJSON в строку запроса, если вы не объедините ее с processData: false, и в этом случае вам необходимо десериализовать значимые объекты «вручную» на стороне сервера.Как правило, это полезный вариант, но в данном случае это излишнее, когда простая проверка, вероятно, будет работать с минимальными трудностями.

0 голосов
/ 07 февраля 2012

Ваша проблема в пустом массиве.Вы можете отправить пустую строку или в соответствии с this попытаться установить traditional: true

, также есть this ответ, который apaart из traditional также предлагает использоватьJSON.stringify.В комментариях также упоминается проблема связывания модели aps.net mvc.

Я не знаю, как ruby ​​достигает эквивалента привязки модели asp.net mvc, но я думаю, что именно здесь вы должны посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...