2017-12-29 12 views
0

EDIT2: die Lösung gefunden, bitte JSON, AJAX, and ASP.NETJSON Stringify nicht auf Array Arbeiten (ASP.NET)

Das Problem ist schließlich, dass der Parameter in dem Ajax-Aufruf nicht an die WebMethod auf der Seite Server gesendet wird, als ein Faden. Die JSON-Zeichenfolge im Datenfeld des Ajaxaufrufs wird tatsächlich in den im WebMethod-Parameter angegebenen Objekttyp konvertiert. Mein Problem war, dass die Daten nicht als String, sondern als anderer Objekttyp in das WebMethod übernommen wurden.

BEARBEITEN: Blick auf die Browser-Konsole in Chrome, bekomme ich diesen Fehler: Fehler beim Laden der Ressource: Der Server antwortete mit einem Status von 500 (Interner Serverfehler). Graben in tiefer, ich habe die folgende Antwort:

{"Message":"Type \u0027System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\u0027 is not supported for deserialization of an array.","StackTrace":" at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList\u0026 convertedList)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"} 

Die folgende Ajax-Aufruf nie ausgeführt wird, und es scheint, wie die Datenparameter keinen gültigen Wert hat. Wenn data einem Zeichenfolgenliteral mit gültigem JSON entspricht, gibt es kein Problem. Es scheint nur ein Problem bei der Umwandlung von Javascript-Objekten in einen gültigen Parameter für data im Ajax-Aufruf zu sein. Bitte beachten Sie den folgenden Code-Schnipsel in meiner aspx-Datei:

<script type="text/javascript"> 
     $(document).ready((function() { 
      $('#mytable tr').click(function (event) { 
       var array = []; 
       $(".tdval").each(function() { 
        array.push({ 
         value: $(this).html() 
        }); 
       }); 
       alert(JSON.stringify(array)); //produces what appears to be valid json after calling stringify: [{"value":"val1"},{"value":"val2"}] 

       $.ajax({ 
        type: "POST", 
        url: "schedule.aspx/GetCurrentTime", 
        data: JSON.stringify({ array }), //this seems to be the issue 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (response){ 
         alert(response.d + "lol"); 
        }, 
        complete: function() { 
         alert("complete"); 
        } 
       }); 
      }); 
     })); 
    </script> 

Und dies ist das Verfahren in der C# -Code hinter dass die Ajax-Aufruf Beiträgen:

[System.Web.Services.WebMethod] 
    public static string GetCurrentTime(string name) 
    { 
     return "Hello "; 
    } 

Interessanterweise ich bin in der Lage data: JSON.stringify({ array }) zu ändern in der Ajax Aufruf an einige zufällige JSON als String-Literal und es funktioniert gut, wie es sollte. Bei Verwendung von stringify wird die Callback-Methode "success" des Ajax-Aufrufs jedoch nie ausgeführt. Irgendwelche Gedanken?

+2

Warum gibt es geschweiften Klammern in der zweiten stringify Anruf? Denke nicht, dass dies erforderlich ist. – ne1410s

+0

'{array}' ist ES6-Kurzschrift für '{array: array}'. Also wird das JSON das Array in der Eigenschaft "Array" des JSON-Objekts haben. Erwartet das der Controller? – Barmar

Antwort

0

Sie haben das Array innerhalb eines Objekts, wenn Sie JSON.stringify() rufen, so dass die JSON sind Senden Sie wird wie folgt aussehen:

{ array: [{"value":"val1"},{"value":"val2"}] } 

statt, was Sie früher in der Funktion alarmiert.

Verwenden Sie stattdessen:

data: JSON.stringify(array), 
+0

Funktioniert immer noch nicht, nachdem die geschweiften Klammern entfernt wurden. Es war eigentlich unbeabsichtigt, diese zu verwenden, es war ein Rest von der Fehlersuche. Ich habe JSONLint verwendet, um zu testen, ob JSON gültig ist oder nicht, und es heißt es. Irgendwelche anderen Vorschläge? –

+0

Haben Sie auf der Registerkarte Netzwerk der Konsole nachgesehen, um zu sehen, ob die AJAX-Anfrage gesendet wird, welche Parameter und welche Antwort der Controller hat? – Barmar

+0

Wenn ich das Zeichenfolgenliteral '{"name": "Bob"} verwende, funktioniert der Code. Die Verwendung von [{"value": "val1"}, {"value": "val2"}] funktioniert jedoch nicht, obwohl JSONLint den gültigen JSON-Wert angibt. Ich habe meinen Code aktualisiert, um die C# -Codebehind-Methode anzuzeigen, an die diese Daten ebenfalls übergeben werden, damit der gesamte Code verfügbar ist. –