2017-02-01 1 views
0

Zunächst möchte ich nur sagen, dass es viele ähnliche Fragen zu diesem bereits hier gepostet, aber ich habe alle Lösungen ausprobiert und hatte keine Freude .Weitergabe von Daten von einem jQuery Ajax Anruf an eine MVC ApiController Aktion verliert Daten

Ich habe eine MVC ApiController Aktion, deren Unterschrift ist:

public void Post([FromBody] Employee employee) 

Ich habe versucht, mit oder ohne [FromBody].

Meine Klasse Employee 5 Mitglieder von Basistypen hat, int, string, string, string, double

ich die Aktion von einer separaten Domäne Aufruf (beide auf meinem localhost mit Cors), jQuery Ajax wie folgt :

$.ajax({ 
     url: "http://localhost:55555/api/Employees", 
     type: "POST", 
     headers: { 
      "Authorization": "Bearer " + sessionStorage.getItem("accessToken") 
     }, 
     data: { 
      Id: 100, 
      FirstName: "Fred", 
      LastName: "Blogs", 
      Gender: "Male", 
      Salary: 100000 
     }, 
     // ... 

Das funktioniert absolut in Ordnung. Es gibt kein Problem mit der Autorisierung. Das Mitarbeiterobjekt auf dem Controller wird mit diesen Daten gefüllt. Aber was ich tun möchte, ist, die Daten in einem „strukturierten‘ Art und Weise senden Also meine Daten wie folgt aussehen würde:..

 data: { 
      employee: employee 
     }, 

Ich habe versucht, alles, was ich denken kann, den Mitarbeiter-Format angegeben alle Kombinationen von:

 contentType: "application/json; charset=utf-8", 
     dataType: "json", 

mit verschiedenen Arten kombiniert zu „stringify“ meine Mitarbeiter Objekt:

var employee = { 
     Id: 100, 
     FirstName: "Fred", 
     LastName: "Blogs", 
     Gender: "Male", 
     Salary: 100000 
    }; 

    employee = JSON.stringify({ "employee": employee }); 
    employee = JSON.stringify(employee); 

bei dieser bezieht sich (wie ein einfacheres Beispiel) ich habe diese Methode auch auf meinem ApiControll er:

public void Delete([FromBody] int employeeId) 

Wieder kann ich die employeeId nicht in der "gewünschten" Weise übergeben.

Ich kann nicht einmal erhalten:

 data: { 
      employeeId: 100 
     }, 

zu arbeiten!?!

Ich kann die Delete-Methode funktionieren, wenn ich es zu [FromUri] ändern und die "? EmployeeId = 100" in der aufrufenden URL angeben.

Ich hatte gehofft, dass ich über den verschiedenen Aufruf ein wenig konsistenter sein könnte und immer ein "Objekt" im JSON-Format übergeben.

Hat jemand irgendwelche Ideen, die mir helfen können, Fortschritte zu machen?

Danke.

Weitere Informationen zum Anruf löschen.

Wenn ich Postman verwenden, Voraussetzung für die Authentifizierung entfernen, geben Sie Content-Type "application/json" im Header und employeeId = 100 in den Körper, gibt Postman:

{ 
    "Message": "The request is invalid.", 
    "MessageDetail": "The parameters dictionary contains a null entry for parameter 'employeeId' of non-nullable type 'System.Int32' for method 'Void Delete(Int32)' in 'WebApi.Controllers.EmployeesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter." 
} 

Antwort

0

ändern data dazu:

data: JSON.stringify({ employee : employee }) 
+0

Ich habe das versucht. Wiederum mit allen Kombinationen von dataType/contentType. Die Methode wird aufgerufen, aber alle Eigenschaften des Employee-Objekts haben innerhalb der ApiController-Aktion immer noch ihre Null-Null-Werte. –

+1

Versuchen Sie, 'content: 'application/json', datatype: "json"' zu '.ajax' Setup $ – JohanP

+0

Immer noch der Mitarbeiter Objekt auf dem Server hat Standardwerte: var employee = { Id: 100, Vorname: "Fred", Nachname: "Blogs" Geschlecht: "männlich", Gehalt: 100000 }; $ Schnipsel ({ url: "http: // ..., Typ: "POST", Header: { "Authorization": "Bearer" + sessionStorage.getItem (" accessToken ") }, contentType: "application/json", dataType: "json", daten: JSON.stringify ({angestellter: angestellter}), –

1

ich glaube nicht, dass „DELETE“ übergibt einen Körper wie ein „POST“, so dass die [FromBody] werden nicht funktionieren, wenn Sie den ajax-Aufruf mit dem Typ anrufen: „löschen“.

Wie für die Mitarbeiter Post Anruf, habe ich ähnliche Probleme gesehen. Die einzige Arbeit, die ich finden konnte, bestand darin, eine Wrapper-Klasse zu erstellen, die den Angestellten umschließt.

public class EmployeeWrapper { 
    public Employee employee {get; set;} 
} 

Dann haben Sie EmployeeWrapper den Parameter für die Post-Methode.

public void Post([FromBody] EmployeeWrapper employeeWrapper) { 
     Employee employee = employeeWrapper.employee; 
     ... 

Auf diese Weise können Sie mit den Ajax-Daten nennen:

data: { 
     employee: employee 
    }, 
+0

** Das hat funktioniert **. Wie Sie jedoch zu zeigen scheinen, ist das ein bisschen unordentlich Ich hätte gedacht, dass eine der stringify() - Optionen auf der Clientseite die Daten so formatieren würde, dass ich das Employee-Objekt direkt verwenden könnte. –

+0

Fairer Kommentar zu Delete(). Ich werde später nachforschen. Ich nehme an, Post/Put sollte genauso funktionieren. –

0

Die folgende Kombination endlich mein Problem behoben.

var employee = { 
     Id: 100, 
     FirstName: "Fred", 
     LastName: "Blogs", 
     Gender: "Male", 
     Salary: 100000 
    }; 

    employee = JSON.stringify(employee); 

    //... 
    contentType: "application/json", 
    data: employee, 
    //... 

Einer der Gründe der ich nicht an dieser früher ankam war, dass ich dazu neigt, die Daten zu umgeben: {...} mit geschweiften Klammern. Dies führte dazu, dass es fehlschlug.

Es ist auch gelungen, die DELETE im Nachrichtentext auf genau die gleiche Weise zu erhalten.

Verwandte Themen