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
相关产品推荐
相关产品推荐

