使用 Mediatr 在 Asp.Net Core 中输入列表文件时获取空值

Getting Null Value When Input List Files in Asp .Net Core with Mediatr

我在调试请求文件时得到空值。这是我的代码:

我的控制器:

    [ProducesResponseType(type: typeof(ReturnDigitalClaimVm), statusCode: StatusCodes.Status200OK)]
    [HttpPost(template: "createclaim")]
    public async Task<IActionResult> CreateClaimDC(
        [FromBody] CreateClaimCommand reqdata, 
        [FromForm] IEnumerable<IFormFile> files)
    {
        var command = new ClaimCommand()
        {
            CommandBody = reqdata,
            Files = files
        };
        return Wrapper(val: await Mediator.Send(request: command));
    }

我的模特:

public class ReturnDigitalClaimVm
{
    public string DocId { get; set; }
}

public class ClaimCommand : IRequest<ReturnDigitalClaimVm>
{
    public CreateClaimCommand CommandBody { get; set; }
    public IEnumerable<IFormFile> Files { get; set; }
}

public class CreateClaimCommand 
{
    public string AWB { get; set; }
}

我的命令处理程序:

public class CreateClaimCommandHandler : IRequestHandler<ClaimCommand, ReturnDigitalClaimVm>
{
   public async Task<ReturnDigitalClaimVm> Handle(ClaimCommand request, CancellationToken cancellationToken)
    {
        var checkReqBody = request.CommandBody.AWB;
        var checkReqFiles = request.Files; //--> I debug my code here
        
        return new ReturnDigitalClaimVm
        {
            DocId = "XXX-123"
        };
    }
}

我对 swagger 的投入:

我的调试:

当我在 CommandHandler 的 var checkReqBody 调试我的代码时,我得到了值“test”,但是在“var checkReqFiles”我得到了空值,即使我已经把两个文件形式昂首阔步。我尝试在控制器和模型中将 IEnumerable<IFormFile> files 更改为 List<IFormFile> files,但我得到了相同的结果。谁能帮帮我?

不能同时拥有[FromForm]和[FromBody]。 它们都从 HTTP 请求主体接收数据,但 [FromBody] 表示它采用 json 格式,而 [FromForm] 表示它采用 url 编码或多部分格式。

您可以像这样更改您的请求代码

public class ReturnDigitalClaimVm
{
    public string DocId { get; set; }
}

public class ClaimCommand : IRequest<ReturnDigitalClaimVm>
{
    public string AWB { get; set; }
    public IEnumerable<IFormFile> Files { get; set; }
}

你不能同时使用[FormBody]和[FromFrom],如果你想在你的请求模型中接收文件和文本,你可以使用multipart/form-data内容类型的[FromForm]。

[ProducesResponseType(type: typeof(ReturnDigitalClaimVm), statusCode: StatusCodes.Status200OK)]
[HttpPost(template: "createclaim")]
public async Task<IActionResult> CreateClaimDC( 
    [FromForm] ClaimCommand  request)
{
    return Wrapper(val: await Mediator.Send(request: request));
}

postman request body

确保在您的其余客户端请求中使用 multipart/form-data。 希望它足够清楚。