使用Mediator CQRS模式时Swagger请求中集合参数为空问题
解决ASP.NET Core API中CreateCVCommand集合参数为空的问题
检查命令类的属性定义
确保集合属性是可写的(包含setter),避免只读属性导致模型绑定无法填充数据。示例:
public class CreateCVCommand : IRequest<int> { // 正确写法:带setter的集合属性,建议初始化空集合避免空引用 public List<WorkExperienceDto> WorkExperiences { get; set; } = new List<WorkExperienceDto>(); public IEnumerable<EducationDto> Educations { get; set; } = new List<EducationDto>(); }
验证API控制器的参数绑定
API接口必须用[FromBody]标记命令参数,因为Swagger提交的是JSON格式数据,需要从请求体绑定:
[HttpPost] public async Task<IActionResult> CreateCV([FromBody] CreateCVCommand command) { var result = await _mediator.Send(command); return Ok(result); }
遗漏[FromBody]会导致框架尝试从路由/查询字符串绑定集合,最终无法解析数据。
检查集合内DTO类的配置
集合中嵌套的DTO类(如WorkExperienceDto)必须是public访问级别,且属性同样包含setter:
public class WorkExperienceDto { public string CompanyName { get; set; } public DateTime StartDate { get; set; } // 其他业务属性... }
如果DTO是internal或者属性无setter,模型绑定器无法实例化并填充数据。
确认Swagger提交的JSON格式
提交的JSON必须匹配命令类结构,集合需用数组格式,且属性名与命令类属性名(或大小写映射规则)一致:
{ "workExperiences": [ { "companyName": "XX科技有限公司", "startDate": "2020-01-01T00:00:00" } ], "educations": [ { "schoolName": "XX大学", "degree": "硕士" } ] }
ASP.NET Core默认支持PascalCase(命令类属性)到camelCase(JSON属性)的自动映射,也可通过配置开启大小写不敏感匹配。
调试验证绑定过程
在控制器方法中添加日志或断点,查看原始请求内容和命令对象状态,排除输入错误:
[HttpPost] public async Task<IActionResult> CreateCV([FromBody] CreateCVCommand command) { // 调试用:读取原始请求JSON Request.Body.Position = 0; using var reader = new StreamReader(Request.Body); var rawJson = await reader.ReadToEndAsync(); Console.WriteLine($"原始请求内容:{rawJson}"); var result = await _mediator.Send(command); return Ok(result); }
内容的提问来源于stack exchange,提问作者AZZOUNI MOHAMED AMIR
相关产品推荐
相关产品推荐

