2012-06-24 9 views
8

Ajax-AufrufKein MediaTypeFormatter ist verfügbar ein Objekt vom Typ 'InventoryItem'

$.ajax({ 
    url: '/api/Inventory', 
    cache: false, 
    type: 'POST', 
    data: json, 
    contentType: 'application/json, charset=utf-8', 
    statusCode: { 
     201: function (data) { 
      console.log(data); 
      viewModel.items.push(data); 
     } 
    } 
}); 

gesendeten Daten (json)/Anfragen Payload

{"Id":0,"Upc":"3456789012","Quantity":"200","Category":"Vodka","TransactionType":"Audit","MetaData":"ABSOLUT 750ml"} 

Antwortfehler

zu lesen Kein MediaTypeFormatter ist verfügbar, um ein Objekt vom Typzu lesen'InventoryItem' von Inhalten mit Medientyp '' unbestimmt ''.“

Routed POST-Methode

public HttpResponseMessage PostItem(InventoryItem item) 

Alle Objekte in dem JSON String ist in dem InventoryItem Modell.

Ein similar question in Bezug auf komplexe Typen vorgeschlagen, von Beta auf RC zu aktualisieren, um eine Änderung der Modellbindung zu beheben, die ich getan habe.

Wenn die Frage nicht offensichtlich ist, wie behebe ich diesen Fehler? Wenn ich der Methode "Routed POST" das Attribut [FromUri] hinzufüge, wird der AJAX-Aufruf ordnungsgemäß weitergeleitet, jedoch mit einem leeren Wert von InventoryItem. Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.

Antwort

19
contentType: 'application/json, charset=utf-8', 

sollte sein:

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

Beachten Sie die Verwendung von ; statt ,, die die richtigen Trennzeichen zwischen dem Inhaltstyp und dem charset ist. Auch wenn Sie Standard RESTful Konventionen Ihre Controller-Aktion folgen sollte Post und nicht PostItem genannt werden, wie Sie gezeigt haben:

public HttpResponseMessage Post(InventoryItem item) 
{ 
    ... 
} 
+0

Nun, ich wurde nach dem [Tutorial] (http://www.asp.net/web- api/raw-content/tutorials/creating-a-web-api-das-unterstützt-crud-operations) und ihre 'POST'-Aktion war' PostProduct'. Das Semikolon hat es jedoch repariert! Vielen Dank. – Josh

+0

Dies ist nicht die Standardkonvention, die von ASP.NET MVC 4 RC-Routen verwendet wird, wenn Sie ein neues Projekt erstellen. Sie benutzen 'api/{Controller}/{id}'. Wie Sie sehen können, ist der Aktionsname kein Teil der URL, was bedeutet, dass die richtige Aktion basierend auf dem HTTP-Verb gewählt wird, das zum Ausführen der Anfrage verwendet wird. Aber das hängt nicht mit Ihrem Problem zusammen. Ihr Problem rührt von der Übergabe eines falschen Werts für den Content-Type-HTTP-Header her. –

+0

Sie sollten also normalerweise nichts anderes als den Anfragetyp zum Aktionsnamen hinzufügen? Wie "Post" oder "Delete" im Gegensatz zu "PostItem" oder "DeleteItem"? – Josh

Verwandte Themen