ABP框架8.0.2扩展用户实体后调用CreateUser API报必填错误
我使用ABP Framework社区版8.0.2创建Blazor项目,扩展User实体添加了自定义字段EmployeeNo,该字段已成功生成到AbpUsers表中,通过UI添加用户功能正常。但在Swagger授权后调用api/identity/users接口创建用户时,无论将employeeNo直接放在请求体中,还是嵌套在extraProperties里,都会收到如下验证错误:
{ "error": { "code": null, "message": "Your request is not valid!", "details": "The following errors were detected during validation.\r\n - The EmployeeNo field is required.\r\n", "data": {}, "validationErrors": [ { "message": "The EmployeeNo field is required.", "members": [ "employeeNo" ] } ] } }
尝试过的两种请求体格式:
格式1:直接传入字段
{ "userName": "string", "name": "string", "surname": "string", "email": "user@example.com", "phoneNumber": "string", "isActive": true, "lockoutEnabled": true, "roleNames": [ "string" ], "employeeNo":"string", "password": "string" }
格式2:放入extraProperties
{ "userName": "string", "name": "string", "surname": "string", "email": "user@example.com", "phoneNumber": "string", "isActive": true, "lockoutEnabled": true, "roleNames": [ "string" ], "extraProperties":{ "employeeNo":"string" }, "password": "string" }
相关配置代码:
EfCoreEntityExtensionMapping.cs
ObjectExtensionManager.Instance .MapEfCoreProperty<IdentityUser, string>(UserConsts.EmployeeNo, (_, propertyBuilder) => { propertyBuilder.HasDefaultValue(""); propertyBuilder.HasMaxLength(UserConsts.MaxEmployeeNoLength); });
ModuleExtensionConfigurator.cs
ObjectExtensionManager.Instance.Modules() .ConfigureIdentity(identity => { identity.ConfigureUser(user => { user.AddOrUpdateProperty<string>( //property type: string UserConsts.EmployeeNo, //property name property => { //validation rules property.Attributes.Add(new RequiredAttribute()); property.Attributes.Add(new StringLengthAttribute(UserConsts.MaxEmployeeNoLength) {MinimumLength = UserConsts.MinEmployeeNoLength}); property.Configuration[IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit] = true; //...other configurations for this property } ); }); });
请问是否需要重写控制器才能解决该问题?
不需要重写控制器,问题根源是扩展属性未正确映射到创建用户的DTO,导致验证逻辑无法识别传入的字段。只需通过ABP的扩展机制配置DTO映射即可解决:
修改ModuleExtensionConfigurator.cs,在ConfigureIdentity块中添加DTO的映射配置,确保扩展属性能绑定到UserCreateDto:
ObjectExtensionManager.Instance.Modules() .ConfigureIdentity(identity => { identity.ConfigureUser(user => { user.AddOrUpdateProperty<string>(UserConsts.EmployeeNo, property => { property.Attributes.Add(new RequiredAttribute()); property.Attributes.Add(new StringLengthAttribute(UserConsts.MaxEmployeeNoLength) { MinimumLength = UserConsts.MinEmployeeNoLength }); property.Configuration[IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit] = true; }); }); // 配置扩展属性到UserCreateDto identity.ConfigureUserCreateDto(dto => { dto.MapExtraPropertyTo<UserCreateDto, string>(UserConsts.EmployeeNo); }); });
配置完成后,使用格式1的请求体(直接传入employeeNo字段)即可正常通过验证。ABP会自动将该字段绑定到DTO,并应用你配置的验证规则。
如果仍希望通过extraProperties传递字段,需要确保验证逻辑能识别extraProperties中的属性。可以在应用服务层手动提取并验证extraProperties里的EmployeeNo,但更推荐使用上述DTO映射的方式,符合ABP的扩展规范。
内容的提问来源于stack exchange,提问作者Kent Hub

