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

使用FromForm绑定嵌套对象时精算师列表绑定失败求助

ASP.NET模型绑定:精算师列表绑定失败排查

已成功通过表单将复杂对象绑定至ASP.NET模型,但精算师事务所(actuarial firm)模块的精算师列表绑定始终失败,该逻辑已在state_details模块的program_details、state_contacts列表绑定中验证有效,无法定位原因。

前端Axios请求代码

const submit = () => {
  let form = new FormData();

  //state details
  form.append('state_details.state_id' , JSON.stringify(stateModel.value!.state_id!))
  programModel.value!.forEach((program : Program, index : number) => {form.append('state_details.program_details['+index+'].program_dd', JSON.stringify(program.program_dd))})
  stateContactModel.value!.forEach((stateContact : User, index : number) => {form.append('state_details.state_contacts['+index+'].internal_user_number', JSON.stringify(stateContact.internal_user_number))})

  //actuarial firm details
  form.append('actuarial_firm_details.firm_dd' , JSON.stringify(actuarialFirmModel.value!.firm_dd))
  form.append('actuarial_firm_details.actuary_details' , hasRiskMitigationModel.value.value)
  signingActuaryModel.value!.forEach((actuary : User, index : number) => {form.append('actuarial_firm_details.signing_actuaries['+ index +'].internal_user_number', JSON.stringify(actuary.internal_user_number))})

  api.post('/CertificationReview', form, config).then(response => {

  })
}

后端模型定义

public class AddCertificationReviewDTO
{
    [ModelBinder(Name = "state_details")]
    [Required]
    public required StateDTO StateDetails {get; set;}

    [ModelBinder(Name = "actuarial_firm_details")]
    [Required]
    public required ActuarialFirmDTO ActuarialFirmDetails {get; set;}
}

public class ActuarialFirmDTO 
{
    [ModelBinder(Name = "firm_dd")]
    [Required]
    public required int FirmDd {get; set;}

    [ModelBinder(Name = "firm_name")]
    public string? FirmName {get; set;}
    
    [ModelBinder(Name = "actuary_details")]
    [Required]
    [Length(1, int.MaxValue, ErrorMessage = "Please enter atleast 1 signing actuary.")]
    public required List<UserDTO> ActuaryDetails {get; set;}
}

public class UserDTO {
    [ModelBinder(Name = "internal_user_number")]
    [Required]
    public required int InternalUserNumber {get; set;}
}

public class StateDTO {
    [ModelBinder(Name = "state_id")]
    [Required]
    public required int StateId {get; set;}

    [ModelBinder(Name = "entity_name")]
    public string? EntityName {get; set;}

    [ModelBinder(Name = "entity_abbreviation")]
    public string? EntityAbbreviation {get; set;}

    [ModelBinder(Name = "program_details")]
    [Required]
    [Length(1, int.MaxValue, ErrorMessage = "Please enter atleast 1 program.")]
    public required List<ProgramDTO> ProgramDetails {get; set;}

    [ModelBinder(Name = "state_contacts")]
    [Required]
    [Length(1, int.MaxValue, ErrorMessage = "Please enter atleast 1 contact.")]
    public required List<UserDTO> StateContacts {get; set;}
}

public class ProgramDTO {
    [ModelBinder(Name = "program_dd")]
    [Required]
    public required int ProgramDD {get; set;}
    
    [ModelBinder(Name = "program_name")]
    public string? ProgramName {get; set;}

    [ModelBinder(Name = "program_short_name")]
    public string? ProgramShortName {get; set;}
}

请求返回错误信息

"errors": {
    "actuarial_firm_details.actuary_details": [
        "Please enter atleast 1 signing actuary."
    ]
}

请求Payload

state_details.state_id: 2
state_details.program_details[0].program_dd: 158
state_details.state_contacts[0].internal_user_number: 660
state_details.state_contacts[1].internal_user_number: 661
actuarial_firm_details.firm_dd: 4
actuarial_firm_details.actuary_details: false
actuarial_firm_details.actuary_details[0].internal_user_number: 1646
actuarial_firm_details.actuary_details[1].internal_user_number: 1673

问题排查与修复

  1. 字段名不匹配:后端ActuarialFirmDTO中精算师列表的ModelBinder名称是actuary_details,但前端循环绑定列表时用的是signing_actuaries,导致无法匹配到正确的属性。需将前端循环中的字段名改为actuary_details:

    signingActuaryModel.value!.forEach((actuary : User, index : number) => {form.append('actuarial_firm_details.actuary_details['+ index +'].internal_user_number', JSON.stringify(actuary.internal_user_number))})
    
  2. 多余的FormData项干扰绑定:前端中form.append('actuarial_firm_details.actuary_details' , hasRiskMitigationModel.value.value)这一行向actuary_details字段传入了布尔值false,但该字段对应后端的List<UserDTO>类型,类型不匹配会导致模型绑定器无法正确解析后续的列表项,直接删除这一行即可。

修改后重新提交,即可完成精算师列表的正确绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:22:18