2017-12-30 32 views
0

Meine clientseitige Datei hat in ihrer jQuery einen AJAX-Aufruf, der JSON-Daten an eine serverseitige WebMethode sendet. Der folgende Code funktioniert:JSON, AJAX und ASP.NET

WebMethod auf serverseitige (C#)

[System.Web.Services.WebMethod] 
public static string GetCurrentTime(string[] name) 
{ 
    string str = ""; 
    foreach(string s in name) 
    { 
     str += s; 
    } 
    return str; 
} 

und der Ajax-Aufruf (jQuery):

 //array = ["a","b","c"] 
     //data = {'name':["a","b","c"]} 
     $.ajax({ 
      type: "POST", 
      url: "schedule.aspx/GetCurrentTime", 
      data: "{'name':" + JSON.stringify(array) + "}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (response){ 
       alert(response.d); 
      }, 
      complete: function() { 
       alert("complete"); 
      } 
     }); 

tl; dr Der obige Code die JSON nimmt string und erstellt ein Array von Strings in der serverseitigen Methode.

Wie würde ich die obige WebMethode umschreiben, wenn ich die JSON zu den folgenden ändern? "Name" ist nicht länger ein Array von Strings wie im obigen Code, sondern ein Array von einigen Objekten, daher müsste der Parametertyp in der WebMethod geändert werden, aber ich bin mir nicht sicher was.

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

Dies ist die Botschaft und stacktrace ich auf Chrome Registerkarte Netzwerk bin Empfang, wenn ich die Ajax-Anforderung ausführen:

Message 
: 
"No parameterless constructor defined for type of 'System.String'." 
StackTrace 
: 
" at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) 
↵ at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) 
↵ at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) 
↵ at System.Web.Script.Serialization.ObjectConverter.AddItemToList(IList oldList, IList newList, Type elementType, JavaScriptSerializer serializer, Boolean throwOnError) 
↵ at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertedList) 
↵ at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) 
↵ at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) 
↵ at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams) 
↵ at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters) 
↵ at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams) 
↵ at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)" 

Antwort

1

Wenn Sie in einem komplexen Objekt in den Webmethod zB senden möchten. {"value":"val1"} Dann müssen Sie eine C# -Klasse mit Eigenschaften erstellen, die Ihrem JSON entsprechen, um die Daten empfangen zu können.

Also in Ihrem Fall benötigen Sie eine Datenklasse, so etwas wie:

public class ValueObject 
{ 
    public string Value { get; set; } 
} 

Dann müssen Sie Ihre Webmethod ändern, um eine Reihe von ValueObject zu akzeptieren:

[System.Web.Services.WebMethod] 
public static string GetCurrentTime(ValueObject[] name) 
{ 
    string str = ""; 
    foreach (var s in name) 
    { 
     str += s.Value; 
    } 
    return str; 
} 

Hinweis der Eigenschaftsname Value muss mit dem Eigenschaftsnamen in Ihrem JSON value

+0

für mich gearbeitet ändern! Vielen Dank. Ich wünschte, es gäbe eine bessere Dokumentation zu meinem Problem. –

0

übereinstimmen, wenn Siepaas wollenWert auf Ihre Web-Methode dann ein Datenmodell erstellen, wie unten

gezeigt
public class Name 
    { 
     public string value { get; set; } 
    } 

    public class RootObject 
    { 
     public List<Name> name { get; set; } 
    } 

Und Ihre Seite Methodensignatur wie unten

[WebMethod] 
[ScriptMethod] 
public static string GetCurrentTime(RootObject list) 
{ 
    string str = ""; 
    foreach (var s in list.name) 
    { 
     str += s.Value; 
    } 
    return str; 
} 
+0

Das hat nicht für mich funktioniert. –

+0

was war das Problem –

+0

Das Problem endete damit, dass der Parameter im Ajax-Aufruf nicht an die WebMethod auf der Serverseite als Zeichenfolge gesendet wird. Die JSON-Zeichenfolge im Datenfeld des Ajax-Aufrufs wird tatsächlich in den Objekttyp konvertiert, der von der WebMethod-Signatur angegeben wird. Mein Problem war, dass die Daten nicht als String, sondern als anderer Objekttyp in das WebMethod übernommen wurden. –