错误:构造函数中的每个参数必须在反序列化时绑定到对象属性或字段

Sku*_*uet 30 c# asp.net

我正在尝试发送数据以将其保存在我的数据库中,基本,所以我将模型发送到我的控制器,然后出现此错误:

“类型“SmgApi.Models.Dto.EquipementDto”上的构造函数“Void .ctor(SmgApi.Models.Entity.EquipmentEntity)”中的每个参数都必须绑定到反序列化时的对象属性或字段。每个参数名称必须与属性或字段匹配对象上的字段。匹配可以不区分大小写。”

但我不反序列化任何东西,我不明白。我的控制器:

[HttpPost]
public async Task<IActionResult> UpdateEquipment(EquipementDto equipment)
{
    return Ok(await _equipmentRepository.UpdateEquipment(new EquipmentEntity(equipment)));
}
Run Code Online (Sandbox Code Playgroud)

设备D至:

public class EquipementDto
{
    [Required]
    public string Id { get; set; }
    public List<PropertyDto> Properties { get; set; }

    [Required]
    public string Type { get; set; }
    public bool isInPalette { get; set; }
    public EquipementDto(EquipmentEntity equipment)
    {
        if (equipment == null)
            return;

        this.Id = equipment.Id;
        this.Type = equipment.Type;
        this.isInPalette = equipment.IsInPalette;
        this.Properties = equipment.Properties.Select(x => new PropertyDto(x)).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的装备界面在前面:

export interface Equipment {
  id: string;
  type: Type;
  isInPalette: boolean;
  properties: Array<Property>;
}
Run Code Online (Sandbox Code Playgroud)

我的请求:

private equipmentUrl: string = environment.apiUrl + '/equipment';

  constructor(private http: HttpClient) {}

  public saveEquipment(equipment: Equipment): Observable<Equipment> {
    return this.http.post<Equipment>(this.equipmentUrl, equipment);
  }
Run Code Online (Sandbox Code Playgroud)

关于我做错了什么有什么想法吗?

小智 55

但我不反序列化任何东西,我不明白。

您可能不会直接执行此操作,但您肯定会要求框架为您反序列化某些内容:

[HttpPost]
public async Task<IActionResult> UpdateEquipment(EquipementDto equipment)
Run Code Online (Sandbox Code Playgroud)

在这里,您告诉框架您希望调用包含表示与您匹配的对象的序列化 json 字符串,EquipementDto并请为您将该字符串反序列化为 的实际实例EquipementDto并将其传递给该方法。

现在我们已经确定了反序列化发生的位置,我们可以看看发生了什么。在反序列化过程中,执行反序列化的框架需要能够构造您想要反序列化的对象。

为了能够构造该对象,它需要一个有效的构造函数。看起来它会接受两种类型的构造函数:

  1. 一个空的构造函数
  2. 具有与对象的属性名称匹配的参数的构造函数(因此框架可以通过构造函数填充它们,而不是直接设置属性。

EquipementDto只有 1 个构造函数,并且该构造函数需要一些EquipmentEntity反序列化框架一无所知的未知数。

现在我不完全确定,但我认为只需在EquipementDto类中添加无参数构造函数即可解决此问题:

[JsonConstructor]
public EquipementDto(){}
Run Code Online (Sandbox Code Playgroud)

  • 可能需要 `JsonConstructor` 属性:“对于一个结构体或具有多个构造函数的类,通过应用 [JsonConstructor] 属性来指定要使用的一个”(https://learn.microsoft.com/en-us/dotnet/ standard/serialization/system-text-json-immutability?pivots=dotnet-5-0) - newtonsoft 的类似规则。 (4认同)