2017-07-11 5 views
0

Ich versuche, Ajax-Aufruf zu machen, um Daten in jqgrid über asmx Webservice hochzuziehen, aber ich bekomme diesen ungültigen Web-Service-Aufruf, fehlender Wert für Parameterfehler.{"Nachricht": "Ungültiger Web-Service-Aufruf, fehlender Wert für Parameter: u0027PersonID u0027."

Die Funktion funktioniert gut, wenn ich den Eingabeparameter in der Web-Service-Aufruf und Ajax-Anfrage entfernen, aber das Problem besteht, sobald ich den Eingangsparameter habe.

Folgenden sehen Sie die Web-Service-Methode

[WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public PersonsGrid Per(string PersonID) 
    { 
     .... 
     return personsGrid; 
    } 

Nach dem Ajax-Aufruf ist:

function getGridInfo() { 

    var personId = document.getElementById('txtPersonID').value;   

    $("#PersonsInfo").jqGrid({ 

     url: '/Service/PersonsService.asmx/GetPersonsInfo', 
     data: "{'PersonID': '" + personId + "'}", 

     datatype: 'json', 
     mtype: 'POST', 
     async: false, 
     ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, 
     serializeGridData: function (postData) { 
      return JSON.stringify(postData); 
     }, 
     jsonReader: { repeatitems: false, root: "d.rows", page: "d.page", total: "d.total", records: "d.records" }, 
     loadonce: false, 
     colNames: ['ID', 'FirstName', 'LastName', 'Email', 'Phone'], 
     colModel: [ 
         { name: 'FirstName', index: 'FirstName', width: 100 }, 
         { name: 'LastName', index: 'LastName', width: 100 }, 
         { name: 'Email', index: 'Email', width: 100 }, 
         { name: 'Phone', index: 'Phone', width: 100 } 
     ], 
     rowNum: 10, 
     rowList: [10, 20, 30], 
     viewrecords: true, 
     gridview: true, 
     rownumbers: true, 
     caption: 'Persons info', 
     loadError: function (xhr, textStatus, errorThrown) { 
      var error_msg = xhr.responseText; 
      var msg = "Some error occured during processing:"; 
      msg += '\n\n' + error_msg; 
      alert(msg); 
     } 
    }); 

Jede Idee, wie dieses Problem zu überwinden. Ich folgte mehreren anderen Posts, aber das funktionierte immer noch nicht. Es hat etwas mit dem Datenparameter in der Ajax-Anfrage zu tun.

+0

Sollte Ihr mtype nicht ‚GET eher als POST? – swatsonpicken

+0

Obwohl ich damit den gleichen Fehler bekomme, habe ich auch ushthttpget = true in der Web-Methode hinzugefügt. –

Antwort

0

Die Option

data: "{'PersonID': '" + personId + "'}" 

enthält zwei Fehler:

  1. jqGrid nicht "wissen" data Parameter, der in jQuery.ajax existieren. Stattdessen kann man postData Parameter verwenden.
  2. Die Zeichenfolge wie {'PersonID': 'same_value'} ist falsche JSON-Zeichenfolge, da JSON " anstelle von ' verwenden muss. Sie können den Code durch Verwendung
  3. beheben Wenn Sie data oder postData als JSON-Zeichenfolge verwenden, sollten Sie serializeGridData entfernen.
postData: '{"PersonID": "' + personId + '"}' 

aber ein solcher Code wird enthält noch schlechter Code. Ich würde empfehlen, Sie JSON.stringify stattdessen zu verwenden, die ein Objekt in JSON-String zu konvertieren:

serializeGridData: function() { 
    return JSON.stringify({PersonID: personId}); 
} 

Solche Callback-Funktion ignoriert das:

postData: JSON.stringify({PersonID: personId}) 

Alternativ Sie data und postData und verwenden Sie die folgende serializeGridData entfernen Standardparameter, der jqGrid sendet und stattdessen PersonID Parameter im JSON-Format sendet.

+0

Das funktionierte, ich verwendete die alternative Option serializeGridData: function() { return JSON.stringify ({PersonID: personId}); } –

0

Haben Sie versucht,

Ändern
data: "{'PersonID': '" + personId + "'}", 

zu

postData: "{'PersonID': '" + personId + "'}", 

, wie Sie in der postdata serializeGridData Funktion angezeigt werden referenzieren.

+0

Ich habe auch versucht, aber immer noch gibt es die gleiche Fehlermeldung –

0

Per Definition ist der Parameter postData ein Objekt und kann keine Zeichenfolge sein.Mehr von der Art der Parameter can be read here

So IMHO die klare Lösung mit einem postdata als Objekt gesetzt ist und verwenden serializeGridData wie folgt aus:

...jqGrid({ 
    ... 
    postData : { "PersonID" : personId }, 
    serializeGridData : function(postData) { 
     return JSON.stringify(postData); 
    }, 
    ... 
}); 

Mit freundlichen Grüßen

+0

[jQuery.ajax] (http://api.jquery.com/jquery.ajax/) erlaubt die Verwendung von 'string' als Wert von' data' Parameter und nicht nur 'PlainObject', das normalerweise verwendet wird. Die Funktion '$ .extend()' kann mit 'string' am ersten Parameter aufgerufen werden und die Zeichenfolge wird nicht geändert. So kann 'postData:" some string "' als Kurzform zum Aufruf von '$ .ajax' mit' data: "some string" 'verwendet werden. Wenn Sie 'type:" POST "' verwenden, wird die Zeichenfolge "some string" einfach in den Hauptteil der Ajax-Anfrage eingefügt. Also 'postData:" some string "' funktioniert auch. Man muss nur den String-Wert von 'postData' konstruieren, wie es der Server erwartet. – Oleg

+0

Sicher ist es so, aber das Konstruieren eines Strings mit Parametern ist sehr schwierig, besonders wenn es notwendig ist, weitere Variablen hinzuzufügen - Sie müssen eine Menge '+ 'und' 'hinzufügen. Der klare und lesbare Weg ist Konstruiere zuerst das Objekt und dann JSON.stringify - aber am Ende ist dies eine Frage der Wahl. –

Verwandte Themen