ASP.NET: проблема jQuery AJAX 'data' param
У меня были проблемы с этим кодом, который я провел последние 3 часа, копаясь и пытаясь найти ответ. Поскольку я не был успешным, я просто отправлю код и спрошу, какие параметры я должен иметь в своем веб-сервисе для обработки этого запроса:
var args = [{ key: 'myId', value: 'myValue' }, { key: 'myOtherId', value: 'myOtherValue'}];
var dataToSend = { name: 'fooId', value: 'fooValue', args: args };
$.ajax({
type: 'POST',
url: 'fooURL',
data: dataToSend,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: OnSuccess,
error: OnError
});
Теперь, какую подпись я должен был бы иметь, чтобы получить мою "dataToSend"?
Я пробовал:
[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Foo(string name, object value, List<Args> args)
{
return "OK";
}
public class Args
{
public string key { get; set; }
public object value { get; set; }
}
и
[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Foo(string name, object value, object[] args)
{
return "OK";
}
а также
[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Foo(dataToSend dataToSend)
{
return "OK";
}
public class dataToSend
{
public string name { get; set; }
public object value { get; set; }
public List<Args> args = new List<Args>();
}
public class Args
{
public string key { get; set; }
public object value { get; set; }
}
Ответы
Ответ 1
Попробуйте передать данные в виде строки, а не объекта, то есть:
$.ajax( {
...
data : '{ a: 2, b: 3 }',
...
} );
Причиной этого является то, что если вы укажете объект как данные, тогда jQuery сериализует данные с использованием формата строки запроса, тогда как сервер ожидает формат JSON напрямую.
Это происходит, несмотря на то, что JQuery использует JSON в качестве типа данных - похоже, это относится только к результату, а не к полезной нагрузке запроса, отправленной на сервер.
Все, что у вас там есть, выглядит правильно для меня.
Ответ 2
Хотя это более старая должность, я думал, что внес свой вклад. Я отправляю ассоциативный массив той же идеи, что и принятое сообщение, мне просто легче писать.
Javascript
postData[0] = 'data!';
postData[1] = 'moar data!';
postData[2] = 'and some data';
$.ajax({
type: 'POST',
url: 'postUrl',
data: { data: postData },
});
PHP
$data = $_POST['data'][0];
$moar_data = $_POST['data'][1];
$and_some_data = $_POST['data'][2];
Ответ 3
Если вы работаете с JSON-совместимыми .NET WebServices/WebMethods... мои советы:
-
Будьте очень осторожны с конфигурацией web.config. Используйте его для включения больших параметров, метода POST и JSON.
-
Используйте фреймворк для обработки десериализации сериализации объектов. Я бы порекомендовал NewtonSoft Json.NET.
Я не думаю, что ASP.NET автоматически выполнит это для вас, ваши параметры всегда являются строками. Вы должны взять эти строки, десериализировать их и превратить в массив объектов.