2009-04-09 5 views
13

J'ai une simple méthode web et un appel ajax et continue de recevoir une erreur en disant qu'il ne peut pas convertir une chaîne en un objet IDictionary ???Passage de paramètre à WebMethod avec jQuery Ajax

Voici l'appel 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) { . . . . 

Voici le 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 

Voici ce que je vois de Firebug:

têtes de réponse
Serveur: Microsoft-IIS /5.1
Date: jeu, 09 avr. 2009 21:43:59 GMT
jsonerror: true
Cache-Control: privé
Type de contenu: application/json; charset = utf-8
Content-Length: 1331

POST: "{\" ID \ ": \" 4 \ "}"

RÉPONSE:

{ "message": "Impossible convertir l'objet de type \ u0027System.String \ u0027 en type \ u0027System.Collections .Generic.IDictionary`2 [System.String, System.Object] \ u0027 "," StackTrace ":" à System.Web.Script.Serialization .ObjectConverter.ConvertObjectToTypeInternal (Object o, Type de type, JavaScriptSerializer serializer, Boolean throwOnError, Objet & convertedObject) \ r \ n at System.Web.Scri pt.Serialization.ObjectConverter.ConvertObjectToTypeMain (Object o, type de type, JavaScriptSerializer sérialiseur, Boolean throwOnError, objet & convertedObject) \ r \ n à System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType (o de l'objet, le type de type, JavaScriptSerializer serializer) \ r \ n à System.Web.Script.Serialization.JavaScriptSerializer.Deserialize (JavaScriptSerializer sérialiseur, entrée de chaîne, Type de type, Int32 depthLimit) \ r \ n à System.Web.Script.Serialization.JavaScriptSerializer .Deserialize [T] (Entrée de chaîne) \ r \ n à System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (contexte HttpContext, sérialiseur JavaScriptSerializer) \ r \ n à System.Web.Script.Services.RestHandler .GetRawParams (WebServiceMethodData méthodeD ata, HttpContext contexte) \ r \ n à System.Web.Script.Services .RestHandler.ExecuteWebServiceCall (contexte HttpContext, WebServiceMethodData methodData) », "ExceptionType" : "System.InvalidOperationException"}

Quelqu'un a des idées à propos de ça? Merci!!

Répondre

30

article rapide:

vos params variables var params = '{ID:' + rowid + '}'; est une chaîne. La ligne: data: JSON.stringify(params), est redondante (ou devrait l'être). Réglez simplement data: params,

Ensuite, sur votre méthode Web, convertissez votre résultat en chaîne JSON et renvoyez-le en tant que chaîne. Si votre classe de méthode Web a l'attribut ScriptMethod, vous n'avez pas besoin de le faire. Renvoyez simplement les données en tant que type natif et Asp.Net fera la conversion en JSON pour vous.

Vous pouvez lire les articles suivants: 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/

+4

Vous êtes l'homme. Merci beaucoup Chris! J'ai ajouté ceci: var jsonText = JSON.stringify ({ID: rowid}); après avoir lu votre article. J'ai lu une tonne d'articles qui montraient des paramètres de passage avec des citations. Le vôtre est le premier que j'ai lu qui a expliqué ET FIXÉ. Mucho gracias! –

+0

Heureux d'avoir aidé. –

1

En plus de ce qui précède, il convient de vérifier pour vous assurer que vous n'êtes pas « stringifying » le tableau JSON plus d'une fois.

J'ai accidentellement appelé JSON.stringify() sur un tableau qui avait déjà été sérialisé, ce qui a provoqué un problème similaire à celui reçu par l'OP.

à savoir

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

Dans ce cas, le changement de arr initialisation variable

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

résolu mon problème. :)

Questions connexes