2017-09-19 2 views
2

Ich versuche, einige JSON in meiner Aktion zu analysieren, die dann die Dinge damit tun werden. Allerdings bekomme ich null als mein Modell anstelle des ausgefüllten Modells.Parsen [FromBody] JSON: Modell Null

Dies ist die json ich zu analysieren, ich versuche:

{ 
    "sameLanguages":true, 
    "sameDeadlines":true, 
    "sameDeliverables":false, 
    "quotations":[ 
    { 
     "name":"zasd", 
     "deliverable":"538184e1-9a62-4ce9-baa7-ed746f267a9a", 
     "subtitleAssignments":{ 
     "languageCombinations":[ 
      { 
      "from":"d177b276-8f10-472f-84c6-f2ef59052a09", 
      "to":"d177b276-8f10-472f-84c6-f2ef59052a09", 
      "startDate":"19-09-2017", 
      "endDate":"19-09-2017" 
      } 
     ], 
     "amount":12 
     }, 
     "translationAssignments":{ 
     "languageCombinations":[ 

     ] 
     } 
    } 
    ] 
} 

Das ist meine Aktion:

[HttpPost] 
public IActionResult Add([FromBody] SubmitQuotationsModel model) 
{ 
    //Do things... 
    return View(); 
} 

Das sind meine Modelle:

public class SubmitQuotationsModel 
{ 
    public bool SameLanguages { get; set; } 
    public bool SameDeadlines { get; set; } 
    public bool SameDeliverables { get; set; } 
    public List<SubmitQuotationModel> Quotations { get; set; } = new List<SubmitQuotationModel>(); 
} 

public class SubmitQuotationModel 
{ 
    public string Name { get; set; } 
    public string Deliverable { get; set; } 
    public List<AssignmentModel> SubtitleAssignments { get; set; } 
    public List<AssignmentModel> TranslationAssignments { get; set; } 
} 

public class AssignmentModel 
{ 
    public List<LanguageCombinationModel> LanguageCombinations { get; set; } 
    public int Amount { get; set; } 
} 

public class LanguageCombinationModel 
{ 
    public string From { get; set; } 
    public string To { get; set; } 
    public DateTimeOffset StartDate { get; set; } 
    public DateTimeOffset EndDate { get; set; } 
} 

Ich schicke die Json aus meinem Knockout/Typoskript-Skript als solches:

fetch('/Quotation/Add', { 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json' 
    }, 
    credentials: 'include', 
    body: this.toJSON() 
}); 

public toJSON(): string { 
    let model = { 
     sameLanguages: this.step1().sameLanguages(), 
     sameDeadlines: this.step1().sameDeadlines(), 
     sameDeliverables: this.step1().sameDeliverables(), 
     quotations: this.step2().quotations().filter((q) => q.isFilledIn()).map((q) => { 
      return { 
       name: q.name(), 
       deliverable: q.selectedDeliverable().id, 
       subtitleAssignments: this.getAssignmentModel(q.subtitleAssignmentGroup()), 
       translationAssignments: this.getAssignmentModel(q.translationAssignmentGroup()) 
      } 
     }) 
    }; 
    return ko.toJSON(model); 
} 

private getAssignmentModel(model: AssignmentGroupModel) { 
    return { 
     languageCombinations: model.assignments().map((a) => { 
      return { 
       from: a.fromLanguage().value, 
       to: a.toLanguage().value, 
       startDate: a.startDate().format('DD-MM-YYYY'), 
       endDate: a.endDate().format('DD-MM-YYYY') 
      } 
     }), 
     amount: model.amount() 
    } 
} 

Ich bekomme keine Ausnahmen, der model Parameter bleibt einfach null. Ich habe festgestellt, dass, wenn ich die SubtitleAssignments und TranslationAssignments in SubmitQuotationModel kommentieren, es die anderen Teile des JSons deserialisiert gerade gut. Aber ich kann nicht herausfinden, warum es mit diesen zwei ...Assignments Deklarationen, die nicht auskommentiert werden, nicht deserialisieren wird.

+0

Können Sie den Code teilen, der den JSON der Controller-Aktion übermittelt? –

+1

Diese 2 Zuordnungen sind Listen, in Ihnen json haben Sie keine eckigen Klammern für sie, sondern geschweifte Klammern. – TanguyB

+0

Sie haben absolut recht. Ich kann nicht glauben, dass ich das verpasst habe. – nbokmans

Antwort

2

UntertitelAssignments und TranslationAssignments sind keine Listen im JSON, aber sie sind Listen in den Modellen. Sie müssen nur AssignmentModel und nicht List<AssignmentModel> sein

+0

Ich kann nicht glauben, dass ich dies übersehen .. danke dich so sehr. Die Lösung war so einfach, aber ich konnte es nicht sehen :( – nbokmans

+0

Manchmal ist eine zweite Reihe von Augen alles was Sie brauchen! –