使用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
问题排查与修复
字段名不匹配:后端
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))})多余的FormData项干扰绑定:前端中
form.append('actuarial_firm_details.actuary_details' , hasRiskMitigationModel.value.value)这一行向actuary_details字段传入了布尔值false,但该字段对应后端的List<UserDTO>类型,类型不匹配会导致模型绑定器无法正确解析后续的列表项,直接删除这一行即可。
修改后重新提交,即可完成精算师列表的正确绑定。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

