如何在asp.net core 3.1中将body中的null传递给端点

Kev*_*ith 9 c# asp.net-core asp.net-core-3.1

我在 asp.net core 3.1 控制器中有以下操作

[ApiController]
[Route("example")]
public class MyExampleController : ControllerBase
{
    [HttpPost("{id}/value")]
    public async Task<IActionResult> Post(string id, [FromBody] int? value)
      => Task.FromResult(Ok());
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好,如果我发布为int的身体值(例如:12,等...)

但是,我找不到null传入值的方法。

如果我传入一个空的正文或null正文,我会得到 400 的状态代码,并带有返回的验证消息A non-empty request body is required.

我还尝试将value参数更改为可选参数,默认值为null

public async Task<IActionResult> Post(string id, [FromBody] int? value = null)
Run Code Online (Sandbox Code Playgroud)

如何将 null 传递给此操作?

Kev*_*ith 15

终于弄明白了,非常感谢@Nkosi 和@KirkLarkin 帮助找到了这个问题。

在将Startup.cs 控制器配置到容器中时,我们只需要将默认的 mvc 选项更改为AllowEmptyInputInBodyModelBinding

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(x => x.AllowEmptyInputInBodyModelBinding = true);
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我们可以传入null帖子的正文,并且效果很好。它还通过属性应用正常的模型验证,而无需手动检查 ModelState:

public async Task<IActionResult> Post(string id,
        [FromBody][Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than 1")]
        int? value = null)
Run Code Online (Sandbox Code Playgroud)


Nko*_*osi 5

参考自动 HTTP 400 响应

[ApiController]属性使模型验证错误自动触发 HTTP 400 响应

这将解释返回的响应。

删除[ApiController]以允许无效请求仍然使其成为控制器操作,并且如果具有该属性的附加功能对当前控制器不重要。

然而,它需要手动应用所需的功能

[Route("example")]
public class MyExampleController : ControllerBase {
    [HttpPost("{id}/value")]
    public async Task<IActionResult> Post(string id, [FromBody] int? value) {

        if (!ModelState.IsValid) {

            //...

            return BadRequest(ModelState);
        }

        //...

        return Ok();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 查看 [`AllowEmptyInputInBodyModelBinding`](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.mvcoptions.allowemptyinputinbodymodelbinding?view=aspnetcore-3.1)。不过,这是一个_global_设置。 (3认同)