解析[FromBody] JSON:模型为null

时间:2017-09-19 14:54:20

标签: c# asp.net-core-mvc frombodyattribute

我正在尝试在我的动作中解析一些json,然后用它来做事。但是我继续将null作为我的模型而不是填写的模型。

这是我试图解析的json:

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

        ]
      }
    }
  ]
}

这是我的行动:

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

这些是我的模特:

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

我从我的knockout / typescript脚本发送json:

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

我没有得到任何异常,model参数只保持为空。我发现,如果我在SubtitleAssignments中注释掉TranslationAssignmentsSubmitQuotationModel,它会对json的其他部分进行反序列化。但是我无法弄清楚为什么它不会用那两个未被注释掉的...Assignments声明反序列化。

1 个答案:

答案 0 :(得分:2)

SubtitleAssignments和TranslationAssignments不是json中的列表,但它们是模型中的列表。他们只需要AssignmentModel而不是List<AssignmentModel>