2016-03-30 37 views
0

Ich bin bei meinem Ende hier. Ich denke, ich brauche nur noch ein paar Augen.WebApi nicht korrekt deserialisieren

Methode Signatur:

public async Task<IHttpActionResult> Post(ApiRequest request) 

Modell:

[SuppressMessage("ReSharper", "CollectionNeverUpdated.Global")] 
[SuppressMessage("ReSharper", "AutoPropertyCanBeMadeGetOnly.Global")] 
public class ApiRequest 
{ 
    [JsonProperty("allowLoadingToDataWarehouse")] 
    public bool AllowLoadingToDataWarehouse { get; set; } 

    [JsonProperty("initialDelay")] 
    public string InitialDelay { get; set; } 

    [JsonProperty("reportIds")] 
    public IEnumerable<string> ReportIds { get; set; } 

    [JsonProperty("reportTypeDelay")] 
    public string ReportTypeDelay { get; set; } 

    [JsonProperty("runType")] 
    [JsonConverter(typeof(StringEnumConverter))] 
    public ReportRunType RunType { get; set; } 

    [JsonProperty("userId")] 
    public string UserId { get; set; } 

    [JsonProperty("wwDelay")] 
    public string WWDelay { get; set; } 

    [JsonProperty("weeks")] 
    public IEnumerable<string> Weeks { get; set; } 
} 

Javascript:

var submitReportRequest = { 
     userId: userid, 
     reportIds: reportids, 
     runType: 'Custom', 
     weeks: selectedweeks, 
     initialDelay: $('#InitialDelay').val(), 
     reportTypeDelay: $('#ReportTypeDelay').val(), 
     wwDelay: $('#WWDelay').val(), 
     allowLoadingToDataWarehouse: $('#AllowLoadingToDataWarehouse').val() 
    }; 

    $.post("/api/SubmitReport", JSON.stringify(submitReportRequest), function (data) { 
     alert('success'); 
    }); 

Serialized Json Von JavaScript Beitrag:

{ 
    "userId": "30", 
    "reportIds": [ 
    "59", 
    "60", 
    "61", 
    "62", 
    "63", 
    "64" 
    ], 
    "runType": "Custom", 
    "weeks": [ 
    "201409", 
    "201410", 
    "201411", 
    "201412" 
    ], 
    "initialDelay": "00:00:00", 
    "reportTypeDelay": "00:00:00", 
    "wwDelay": "00:00:00" 
} 

Schnellüberwachung von deserialisiert Objekt Quickwatch of Deserialized Object

Anfangs hatte ich int und TimeSpan für die Ids und Verzögerungen sind, und diejenigen, wurden Deserialisieren nicht korrekt. Also habe ich sie alle in Strings geändert, und sie werden immer noch nicht richtig deserialisiert.

Was mache ich falsch oder fehlt?

Edit: Nachdem ich jede Kombination von Attributen ausprobiert hatte, entschied ich mich schließlich dafür, es in den Fiddler Composer zu stecken. Und es funktioniert. Also muss etwas mit meinem JavaScript los sein.

+0

Was meinen Sie mit "nicht richtig deserialisieren?" Welches Verhalten beobachtest du? –

+0

Versuchen Sie, alle benutzerdefinierten 'JsonProperty'-Attribute zu entfernen und versuchen Sie schließlich,' [FromBody] ApiRequest request' in der API-Signatur zu verwenden. Nur um zu verstehen, was vor sich geht ... –

+0

Auch wenn ich nicht sicher sagen kann, dass es Ihr Problem verursacht, gibt es keinen Grund, dass ReportIds keine ICollection oder IList sein können, da Sie es sowieso von einem Javascript-Array deserialisieren Es gibt keine faule Wiederholung. –

Antwort

1

Es stellt sich heraus, dass eine Abkürzung JQuery post() Methode, um das Content-Type Attribut auf der Anfrage an application/x-www-form-urlencoded; charset=UTF-8 einstellt, wenn es benötigt, um application/json; charset=UTF-8

ich durch die Beobachtung des Netzwerkverkehrs in Chrome, und dies durch die Änderung meiner Javascript gefunden gesetzt werden answer.