Передача параметра в WebMethod с помощью jQuery Ajax
У меня есть простой веб-метод и вызов ajax и продолжаю получать ошибку, говорящую, что он не может преобразовать строку в объект IDictionary.
Вот вызов ajax:
var params = '{"ID":"' + rowid + '"}';
$.ajax({
url: 'EDI.asmx/GetPartnerDetails',
type: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(params),
dataType: "json", //not json . let me try to parse
success: function(msg, st) { . . . .
Вот webMethod:
<WebMethod()> _
Public Function GetPartnerDetails(ByVal ID As String) As String
'Dim objParam As IDictionary = CType(JsonConvert.DeserializeObject(ID), IDictionary)
'Dim rowID As String = objParam("ID")
Dim objController As New HealthComp.BLL.X12Partners.TradingPartnersController
Dim objInfo As TradingPartnersInfo = objController.FetchByPartnerID(Int32.Parse(ID))
Return JsonConvert.SerializeObject(objInfo)
End Function
Вот что я вижу из FireBug:
Заголовки ответов
Сервер: Microsoft-IIS/5.1
Дата: чт, 09 апр 2009 21:43:59 GMT
jsonerror: правда
Cache-Control: частный
Content-Type: применение /JSON; кодировка = UTF-8
Контент-длина: 1331
POST: "{\" ID\ ": \" 4\ "}"
ОТВЕТ:
{ "Сообщение": "Невозможно преобразовать объект типа \u0027System.String\u0027 для ввода \u0027System.Collections
.Generic.IDictionary`2 [System.String, System.Object]\u0027 "," StackTrace ":" в System.Web.Script.Serialization
.ObjectConverter.ConvertObjectToTypeInternal(Object o, Тип типа, JavaScriptSerializer serializer, Boolean
throwOnError, Object & convertObject)\r\n в System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Тип типа, JavaScriptSerializer serializer, Boolean throwOnError, Object & convertObject
)\r\n в System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(объект o, тип типа, JavaScriptSerializer
serializer)\r\n в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer
serializer, String input, Тип типа, Int32 depthLimit)\r\n в System.Web.Script.Serialization.JavaScriptSerializer
.Deserialize [T] (ввод строки)\r\n в System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(Контекст HttpContext, сериализатор JavaScriptSerializer)\r\n в System.Web.Script.Services.RestHandler
.GetRawParams(метод WebServiceMethodDataData, контекст HttpContext)\r\n в System.Web.Script.Services
.RestHandler.ExecuteWebServiceCall(контекст HttpContext, метод WebServiceMethodData methodData) "," ExceptionType ":" System.InvalidOperationException"}
У кого-нибудь есть идеи об этом? Спасибо!!
Ответы
Ответ 1
Быстрый элемент:
ваши переменные params
var params = '{ID:' + rowid + '}';
это строка.
Итак, строка:
data: JSON.stringify(params),
является избыточным (или он должен быть).
Просто установите data: params,
Далее, в вашем веб-методе, вы преобразовываете свой результат в строку JSON и возвращаете это как строку. Если у вашего класса веб-метода есть атрибут ScriptMethod, вам не нужно это делать.
Просто верните данные как родной тип, и Asp.Net выполнит преобразование в JSON для вас.
Вы можете прочитать следующие статьи:
http://elegantcode.com/2009/02/21/javascript-arrays-via-jquery-ajax-to-an-aspnet-webmethod/
http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/
Ответ 2
В дополнение к вышесказанному, стоит проверить, чтобы вы не "строгали" массив JSON более одного раза.
Я случайно вызвал JSON.stringify() в массиве, который уже был сериализован, что вызвало аналогичную проблему с тем, который получил OP.
то есть.
var arr = JSON.stringify({ id: elementID, name: Name });
....
$.ajax({
...
data: JSON.stringify(arr),
...
});
В этом случае изменение инициализации переменной arr на
var arr = { id: elementID, name: Name };
разрешил мою проблему.:)