nbokmans
nbokmans

Reputation: 5757

Parsing [FromBody] JSON: model null

I'm trying to parse some json in my action which will then do things with it. However I keep getting null as my model instead of the filled out model.

This is the json I'm trying to parse:

{
  "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":[

        ]
      }
    }
  ]
}

This is my action:

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

These are my models:

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; }
}   

I am sending the json from my knockout/typescript script as such:

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()
    }
}   

I'm not getting any exceptions, the model parameter just remains null. I have found that if I comment out the SubtitleAssignments and TranslationAssignments in SubmitQuotationModel, it deserializes the other parts of the json just fine. But I can't figure out why it won't deserialize with those two ...Assignments declarations not commented out.

Upvotes: 2

Views: 621

Answers (1)

Aaron Roberts
Aaron Roberts

Reputation: 1372

SubtitleAssignments and TranslationAssignments aren't lists in the json but they are lists in the models. They just need to be AssignmentModel and not List<AssignmentModel>

Upvotes: 2

Related Questions