微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 ASP.Net Core 5 MVC 控制器中,当传递包含小数的 JSON 对象 FromBody 时,模型始终为空

如何解决在 ASP.Net Core 5 MVC 控制器中,当传递包含小数的 JSON 对象 FromBody 时,模型始终为空

传入此 json 有效:

{
  "products": [
    {
      "barcode": "1","quantity": 1,"name": "Barratt Fruit Salad Chews 400 pc Box","unitPrice": 8,"totalPrice": 8,"isInBuyTwoGetoneFreePromotion": false
    }
  ]
}

传入此 json 不起作用:

{
  "products": [
    {
      "barcode": "8","quantity": "4","name": "Bonds dinosaurs","unitPrice": 0.5,"totalPrice": 2,"isInBuyTwoGetoneFreePromotion": true
    }
  ]
}

原因是传递的小数点。

我的控制器有这个方法

[HttpPost]
        public async Task<JsonResult> UpdateStockAndLogInvoice([FromBody] Invoice invoice)

它引用了这个模型:

public partial class Invoice
    {
        [JsonProperty("products")]
        public List<InvoiceItem> Products { get; set; }
    }

    public partial class InvoiceItem
    {
        [JsonProperty("barcode")]
        public string Barcode { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("quantity")]
        public int Quantity { get; set; }

        [JsonProperty("totalPrice")]
        public long TotalPrice { get; set; }

        [JsonProperty("unitPrice")]
        public long UnitPrice { get; set; }

        [JsonProperty("isInBuyTwoGetoneFreePromotion")]
        public bool IsInBuyTwoGetoneFreePromotion { get; set; }
    }

我认为问题在于从 javascript 中使用的浮点数转换为 C# 中长期使用的浮点数,但我已经搜索了互联网,无法弄清楚如何让我的模型传入不为空。

感谢您的任何建议!

解决方法

您失败的 JSON 至少在两个方面与您的 InvoiceItem 类不兼容:

  • Quantity 不是字符串。
  • UnitPrice 很长,不能接受浮点值。

在请求处理期间,MVC 模型绑定器尝试将 JSON 正文反序列化为请求的 InvoiceItem 类型并失败。它将此失败视为正文为空,检查您是否已告诉它允许空正文(默认情况下它会这样做),并继续像没有提供正文一样。

要解决此问题,您需要解决客户端和服务器端模型之间的差异。由于 JavaScript 真的不关心类型,因此您必须特别小心以确保正确管理客户端数据,否则它不会在服务器端正确反序列化。不同的 ASP.NET MVC 版本在自动处理的翻译方面可能有不同的限制,但与您的模型匹配的有效 JSON 将始终有效。

所以...更新您的服务器端模型以对 UnitPriceTotalPrice 属性使用十进制,然后修复您的客户端 javascript 以放入正确的值类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。