How to pass null in body to endpoint within asp.net core 3.1

Finally figured this out, big thanks to @Nkosi and @KirkLarkin helping fault find this.

Within the Startup.cs when configuring the controllers into the container we just need to alter the default mvc options to AllowEmptyInputInBodyModelBinding

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(x => x.AllowEmptyInputInBodyModelBinding = true);
}

This way we can pass in null into the body of the post and it works perfectly fine. It also still applies the normal model validation via the attributes without having to check the ModelState manually:

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

Reference Automatic HTTP 400 responses

The [ApiController] attribute makes model validation errors automatically trigger an HTTP 400 response

This would explain the returned response.

Remove the [ApiController] to allow the invalid request to still make it to the controller action and also if the additional features of having that attribute is not critical to the current controller.

It would however require that the desired featured be applied manually

[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();
    }
}