【问题标题】:Getting Null Value When Input List Files in Asp .Net Core with Mediatr使用 Mediatr 在 Asp .Net Core 中输入列表文件时获取空值
【发布时间】:2021-09-03 15:12:49
【问题描述】:

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

我的控制器:

    [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"
        };
    }
}

我来自招摇的输入:

我的调试:

当我在 var checkReqBody 的 CommandHandler 中调试我的代码时,我得到了值“test”,但在“var checkReqFiles”我得到了 null 值,即使我已经把两个文件形成了招摇。我尝试在控制器和模型中将IEnumerable&lt;IFormFile&gt; files 更改为List&lt;IFormFile&gt; files,但我得到了相同的结果。谁能帮帮我?

【问题讨论】:

  • 在控制器中,文件有值吗?
  • 在控制器中,文件为空
  • 那你的问题不是MediatR。检查建议的解决方案。

标签: c# asp.net-core file-upload mediatr


【解决方案1】:

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

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。 希望它足够清楚。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 2017-06-12
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多