【问题标题】:The JSON value could not be converted to System.Boolean. Path: $JSON 值无法转换为 System.Boolean。路径:$
【发布时间】:2021-06-26 01:33:56
【问题描述】:

我正在尝试从 Angular 前端向 asp.net API 服务器发送请求。 提交的表单定义为:

export class SaleToUpdate {
    id: number;
    shipped: boolean;
    shipDate: string;
    returned: boolean;
    returnDate: string;
}

标记和代码

<mat-grid-tile [colspan] = "2" [rowspan] = "1">
        <mat-form-field>
            <input formControlName="shipDate" matInput placeholder="Ship Date">                                         
         </mat-form-field>                
         <div class="radio-group ml-3">
              <mat-radio-group formControlName="shipped" required (ngModelChange)="shipped">           
                    <mat-radio-button value="false">No</mat-radio-button>
                     <mat-radio-button value="true" class="ml-4">Yes</mat-radio-button>
              </mat-radio-group>
         </div>
</mat-grid-tile>  

onSubmit() 方法

onSubmit() {    
   if (this.salesService.saleForm.valid) {
      let sale: SaleToUpdate = this.salesService.saleForm.value;  
      console.log(sale); 

      this.salesService.updateSale(sale.id, sale).subscribe(res => {
         console.log(res);
      }, error => {
        console.log(error);
      });
   } 
}

因此,基本上,我的目的是将表单数据(SaleToUpdate 类)发送到后端服务器。

服务器端的 DTO

using System;
namespace API.Dtos
{
   public class SaleUpdateDto
   {      
       public int Id { get; set; }          
       public bool Shipped { get; set; }
       public DateTime ShipDate { get; set; }       
       public bool Returned { get; set; }
       public DateTime ReturnDate { get; set; }
   }
}

从控制台,我得到了错误

无法将 JSON 值转换为 System.Boolean。路径:$.shipped |行号:0 | BytePositionInLine: 274." 当从客户端点击提交时。

我注意到表单中 shipped&returned 的值是 string 数据类型,而不是 boolean 数据类型

谁能帮我解决任何可能的问题?

【问题讨论】:

    标签: json angular typescript type-conversion boolean


    【解决方案1】:

    格式化Class中的boolean字段

    let sale: SaleToUpdate = this.salesService.saleForm.value;  
    
    sale.shipped = sale.shipped === 'true' ? true: false;
    sale.returned = sale.returned === 'true'? true: false;
    

    【讨论】:

    • 抱怨条件“sale.shipped === 'true'”和“sale.returned === 'true'”,因为“条件将始终返回'false',因为类型' boolean' 和 'string' 没有重叠。”
    • 我最终使它工作如下: data.shipped = this.salesService.saleForm.controls['shipped'].value === 'true' ?真假; data.returned = this.salesService.saleForm.controls['returned'].value === 'true' ?真假;我猜想,这可行的原因可能是这些值可能必须直接来自表单控件,而不是来自应用 ISale 后的表单值。
    【解决方案2】:

    您需要在提交之前格式化表单数据。只需创建一个新的数据对象并将值从字符串解析为布尔值。像这样的

    onSubmit() {    
        if (this.salesService.saleForm.valid) {
          let sale: SaleToUpdate = this.salesService.saleForm.value;  
          console.log(sale); 
          //this is where to parse object
          var data = {
                id = sale.id,
                shipDate = sale.shipDate,
                shipped = sale.shipped === 'true' ? true: false //this line does the trick
                ....
           }
          this.salesService.updateSale(sale.id, data).subscribe(res => {
            console.log(res);
          }, error => {
            console.log(error);
          });
        } 
      }

    希望对您有所帮助

    【讨论】:

    • 抱怨:速记属性“id”的范围内不存在任何值。要么声明一个,要么提供一个初始化器。
    • 你对我对上述答案的看法有什么意见吗?
    猜你喜欢
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多