Передача нескольких Json-объектов в виде данных с использованием jQuery's $ .ajax () - PullRequest
7 голосов
/ 09 октября 2009

Я отправляю данные на контроллер MVC и пытаюсь также поддерживать состояние для оптимистичного параллелизма. В настоящее время я отправляю запрос в формате JSON, но будет ли он открыт для работоспособных альтернатив?

Я уже публикую коллекцию имен / значений с помощью следующей команды:

$.ajax({
    url: g_appPath + "/Rounding.aspx/Round/" + $("#OfferId").val(),
    type: 'POST',
    dataType: 'html',
    data: $.toJSON(data), // <-- data = name/value array
    contentType: 'application/json; charset=utf-8',
    beforeSend: doSubmitBeforeSend,
    complete: doSubmitComplete,
    success: doSubmitSuccess
});

У меня также есть (зашифрованный) массив идентификаторов и временных меток, которые я хочу передать обратно, чтобы сервер мог расшифровать их, а затем проверить, что данные еще свежи, прежде чем они сохранят их.

Очень важно, чтобы объект данных был отдельным и не являлся дочерним по отношению к одному или другому или в массиве-обертке (из-за отражающей десериализации на стороне сервера). Также важно отметить, что я хочу сделать это асинхронно и не как отправка формы.

У меня такой вопрос: можно ли как-нибудь опубликовать 2 объекта JSON, используя «application / json» в качестве типа контента?

Мой другой вопрос: есть ли лучший / другой способ, которым я мог бы сделать это?

спасибо заранее!

ОБНОВЛЕНИЕ : я решил свою проблему, изменив для параметра contentType значение по умолчанию и вместо этого отправив строковые данные ajax в виде отдельных именованных параметров в строке запроса.

Когда вы используете contentType: 'application / json; charset = utf-8 ', это помещает данные в тело запроса, а не в строку запроса. Мой новый пост $ .ajax () теперь выглядит так:

$.ajax({
    url: g_appPath + "/Rounding.aspx/Round/" + $("#OfferId").val(),
    type: 'POST',
    dataType: 'html',
    data: "RoundingData=" + $.toJSON(data) + "&StateData=" + $.toJSON(stateData),
    // --removed! contentType: 'application/json; charset=utf-8',
    beforeSend: doSubmitBeforeSend,
    complete: doSubmitComplete,
    success: doSubmitSuccess
});

Этот вопрос действительно возник из-за моей неопытности в этом типе операций с данными, и я надеюсь, что кто-то ищет это в будущем, может наткнуться на это.

спасибо!

Dan

Ответы [ 5 ]

16 голосов
/ 09 октября 2009

Насколько я знаю, нет способа отправить обратно два совершенно разных объекта JSON, которые не являются дочерними для одного родительского объекта JSON и которые для вас jQuery декодируют, используя метод .ajax(). Вы могли бы, я полагаю, ответить двумя объектами JSON в виде строк, а затем использовать внешнюю библиотеку JSON для оценки строк в объекте Javascript.

Это отвечает на ваш вопрос?

по электронной почте Ой: Вы спрашиваете о публикации двух разных объектов JSON на вашем контроллере из jquery ..., верно? Мой плохой ... Да, вы можете сделать это ... Просто измените эту строку:

data: $.toJSON(data),

до:

data: { json_1:$.toJSON(data_1), json_2:$.toJSON(data_2) },

Извините, что перепутал.

1 голос
/ 22 июня 2010

Вы можете сделать это простым способом в asp.net, если вы просто хотите отправить несколько данных на webmethod

data: '{userName: "' + $("#<%=txtUserName.ClientID%>")[0].value + '",userName1: "' + $("#<%=TextBox1.ClientID%>")[0].value + '" }',
1 голос
/ 09 октября 2009

Если я вас правильно понял, функционально говоря, вы хотите отправить

object 1,
object 2

, что эквивалентно отправке

[
    object 1,
    object 2
]

Единственное отличие состоит в том, что в первом случае массив является неявным, а во втором - явным. В любом случае это все еще там, но если вы хотите отправить несколько объектов в JSON, вам нужно использовать явный подход.

Таким образом, упаковка двух объектов данных в массив действительно идеальный выбор, но если ваш серверный код не будет поддерживать, вам понадобится альтернатива. Единственный возможный способ сделать это - поместить оба объекта данных в другой объект, например:

var data = {};
data[0] = data1;
data[1] = data2;

А затем вы отправляете data через AJAX-вызов.

Я бы сказал, что проблема не в вашем подходе, а в обработке JSON на принимающей стороне.

0 голосов
/ 11 декабря 2010

Это ответ после очень долгого времени, но он может пригодиться вам в будущем.

Я предлагаю вам прочитать этот ответ на стекопоток , который непосредственно касается вашей проблемы.

0 голосов
/ 09 октября 2009

Я думаю, вы можете сделать что-то вроде этого:

var data = {};
var object1 = {};
var object2 = {};

data.object1 = object1;<br/>
data.object2 = object2;

// serializer

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