You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core控制器接收EquipementDto报构造函数绑定错误如何解决

错误原因

"Each parameter in constructor 'Void .ctor(SmgApi.Models.Entity.EquipmentEntity)' on type 'SmgApi.Models.Dto.EquipementDto' must bind to an object property or field on deserialization. Each parameter name must match with a property or field on the object. The match can be case-insensitive."

你没有手动调用反序列化,但ASP.NET Core框架处理POST请求时会自动执行JSON到控制器参数(EquipementDto)的模型绑定反序列化操作,触发报错的核心原因是:

  • 你的EquipementDto类仅定义了1个接收EquipmentEntity类型参数的构造函数,没有公开的无参构造函数
  • 框架尝试用带参构造反序列化时,构造参数equipment无法和类的公开属性Id/Type/Properties/isInPalette匹配,因此抛出异常
解决方案

最简单的修复方式是给EquipementDto添加无参构造函数,保留原有带参构造供你自己做Entity转DTO使用即可:

public class EquipementDto
{
    // 新增公开无参构造函数
    public EquipementDto()
    {
    }

    [Required]
    public string Id { get; set; }
    public List<PropertyDto> Properties { get; set; }
    [Required]
    public string Type { get; set; }
    // 建议调整为C#标准Pascal命名,加特性匹配前端小驼峰字段
    [JsonPropertyName("isInPalette")]
    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();
    }
}
  • 如果你用的是Newtonsoft.Json做序列化,把[JsonPropertyName]替换成[JsonProperty("isInPalette")]即可
  • 另外注意你的DTO类名拼写有错误:EquipementDto少了字母p,正确拼写应为EquipmentDto,如果项目内已经全局使用这个拼写可以忽略,否则建议修正避免后续引用错误

内容的提问来源于stack exchange,提问作者Skullkid Saquet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 06:57:03