使用 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。
希望它足够清楚。
我在调试请求文件时得到空值。这是我的代码:
我的控制器:
[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。 希望它足够清楚。