2016-04-06 10 views
0

Ich verwende die github/fetch polyfill, um einige Daten zurück auf den Server zu buchen.ASP.NET MVC - JSON Fetch POST automatisch aufheben

fetch('./PerformSearch', { 
    method: 'POST', 
    header: { 
     'Accept' : 'application/json', 
     'Content-type' : 'application/json' 
    }, 
    body: JSON.stringify({ 
     terms: this.refs.termsFilter.getSelections(), 
     details: this.refs.detailsFilter.getSelections(), 
     dateRange: { 
      from: new Date(), 
      til: new Date() 
     } 
    }) 
}) 

aber die Steuerung nicht automatisch deserialising den Körper der Anforderung an das Datenobjekt in dem Argument, wie es von Formularvariablen tun würde. Wenn ich dies mit XmlHttpRequest zwar tun, es funktioniert ..

var request = new XMLHttpRequest(); 
     request.open("POST", url, true); 
     request.setRequestHeader("Content-type","application/json;charset=UTF-8") 
     ... 
     request.send(JSON.stringify(data)) 

Die Funktion die Anforderung in der Steuerung Empfang im Moment ziemlich einfach - es hat nichts zu tun, ich versuche nur, um es an deseralise die json Körper jetzt auf das Datenobjekt mit dem folgenden:

public JsonResult PerformSearch(SearchModel.SearchSelections data) 
{ 
    //data has not been serialised 
    Stream req = Request.InputStream; 
    string body = new IO.StreamReader(req).ReadToEnd; 

    Console.WriteLine(body); // writes a json string 
} 

Also ja, ich könnte dies selbst innerhalb der Funktion deserialise die json-Bibliothek, aber ich würde lieber einen Weg finden, um den Controller zu tun hat es für mich.

UPDATE:

Hier ist das .net Objekt ich deseralise versuchen:

class SearchModel 
{ 
    public class SearchSelections 
    { 
     public SearchTermList terms { get; set; } 
     public SearchDetailsList details { get; set; } 
     public DateRange dateRange { get; set; } 
    } 

    public class SearchTermList 
    { 
     public IEnumerable<string> exams { get; set; } 
     public IEnumerable<string> areas { get; set; } 
     public IEnumerable<string> classes { get; set; } 
     public IEnumerable<string> tokens { get; set; } 
    } 

    public class SearchDetailsList 
    { 
     public IEnumerable<string> studyTypes { get; set; } 
     public IEnumerable<string> species { get; set; } 
     public IEnumerable<string> strains { get; set; } 
    } 

    public class DateRange 
    { 
     public System.DateTime @from { get; set; } 
     public System.DateTime til { get; set; } 
    } 

} 
+0

Sind Sie sicher dass das SearchModel.SearchSelections-Modell dem JSON-Modell entspricht, das Sie auf den Server übertragen? – Anton

+0

ja, ich kann sie beide in der Frage hinzufügen, wenn Sie möchten? –

+0

Ja, bitte fügen Sie es hinzu – Anton

Antwort

0

dumme Fehler:

header: {'Content-type' : 'application/json'} 

sollte headers gewesen sein:

headers: {'Content-type' : 'application/json'}