Передача параметра в WebMethod с помощью jQuery Ajax - PullRequest
13 голосов
/ 10 апреля 2009

У меня простой веб-метод и вызов 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()> _
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 \ "}"

ОТВЕТ:

{"Message": "Невозможно преобразовать объект типа \ System.String \ u0027 в тип \ u0027System.Collections .Generic.IDictionary`2 [System.String, System.Object] \ u0027 "," StackTrace ":" в System.Web.Script.Serialization .ObjectConverter.ConvertObjectToTypeInternal (Объект o, Тип типа, Сериализатор JavaScriptSerializer, Логическое значение throwOnError, Object & convertObject) \ r \ n в System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain (Объект o, Тип type, Сериализатор JavaScriptSerializer, Логический throwOnError, Объект & convertObject ) \ r \ n в System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType (Object o, Type type, JavaScriptSerializer serializer) \ r \ n в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize (JavaScriptSerializer сериализатор, строковый ввод, тип Type, Int32 deepLimit) \ r \ n в System.Web.Script.Serialization.JavaScriptSerializer .Deserialize [T] (String input) \ r \ n в System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (Контекст HttpContext, сериализатор JavaScriptSerializer) \ r \ n на System.Web.Script.Services.RestHandler .GetRawParams (метод WebServiceMethodData methodData, контекст HttpContext) \ r \ n в System.Web.Script.Services .RestHandler.ExecuteWebServiceCall (контекст HttpContext, метод WebServiceMethodData methodData) "," ExceptionType " : "System.InvalidOperationException"}

У кого-нибудь есть идеи по этому поводу? Спасибо !!

Ответы [ 2 ]

31 голосов
/ 10 апреля 2009

Быстрый предмет:

ваши переменные параметры 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/

1 голос
/ 08 сентября 2015

В дополнение к вышесказанному, стоит проверить, чтобы убедиться, что вы не «стренизируете» массив JSON более одного раза.

Я случайно вызвал JSON.stringify () для массива, который уже был сериализован, что вызвало аналогичную проблему с тем, который получил OP.

т.е.

var arr = JSON.stringify({ id: elementID, name: Name });
....
$.ajax({
...
data: JSON.stringify(arr),
...
});

В этом случае изменение инициализации переменной arr на

var arr = { id: elementID, name: Name };

решил мою проблему. :)

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